2011-06-10 38 views
6

對於NoSQL,選擇特定的NoSQL數據庫的選擇有很多,如NoSQL wiki中所述。用什麼NoSQL數據庫來替代MySQL?

在我的應用程序中,我想用NOSQL替換替換mysql。在我的應用程序中,我有用戶表,它與大量其他表具有一對多關係。其中一些表又與其他表格相關。另外我有一個用戶連接到另一個用戶,如果他們是朋友。

我沒有要存儲的文檔,所以這消除了面向文檔的NoSQL數據庫。 我想要非常高的性能。 NOSQL數據庫應該與Play Framework和Scala語言一起使用。 它應該是開源的和免費的。

因此,上面給出了什麼NoSQL數據庫我應該使用?

回答

1

在這一點上,答案是沒有,恐怕。

您不能僅將關係模型與連接轉換爲鍵值存儲設計,並期望它是1:1映射。從你所說的看來,你確實有連接,其中一些是遞歸的,即引用同一個表中的另一行。

您可能會先反規範化現有的關係模式,將其移近您希望實現的設計。然後,如果您正在嘗試做的事情能夠以切實可行的方式完成,並且可以選擇哪種技術,則可以更輕鬆地看到。你甚至可以選擇繼續使用MySQL。僅僅因爲你可以進行連接並不意味着你必須這樣做,這使得在像MySQL這樣的關係數據庫管理系統中有非關係設計成爲可能。

另外,請記住 - 非關係數據庫是爲可伸縮性而設計的 - 不是性能!如果您沒有成千上萬的用戶和服務器羣,那麼傳統的關係數據庫實際上可能對您更好。

+2

您在混淆NoSql和鍵值數據存儲。像Graph數據庫(Neo4J)和OO數據庫(db4o)這樣的NoSql數據庫不是鍵值數據存儲。他們提供強大的關係機制。 – 2011-06-10 23:32:49

+0

@Vagif:老實說,我真的不喜歡NoSQL這個名字(或者非關係型),因爲它定義了它不是什麼,而是它是什麼。按照相同的推理,我猜這個老式的文件系統可能被稱爲NoSQL,因爲它不是SQL或關係型的。 OTOH,你對圖形數據存儲是正確的,我沒有想到這一點。 – 2011-06-11 16:55:23

+0

那麼,我們有無神論者,他們沒有什麼,而不是他們擁有什麼。在一個由宗教無神論主宰的世界裏,這是一個有效的定義。在由SQL數據庫支配的世界中,我猜NoSql確實有意義。 – 2011-06-11 22:28:06

8

我想你可能會誤解「文檔數據庫」的性質。因此,我會推薦MongoDB,這是一個文檔數據庫,但我認爲你會喜歡它。

MongoDB存儲基本上是JSON記錄的「文檔」。很酷的部分是它瞭解它存儲的文檔的內部。因此,考慮一個文件是這樣的:

{ 
    "name": "Gregg", 
    "fave-lang": "Scala", 
    "fave-colors": ["red", "blue"] 
} 

你可以在「最喜歡的琅」或「最喜歡的 - 色彩」查詢。你甚至可以在這些領域的任何一個上進行索引,甚至是「fave-colors」數組,這就需要在關係土地上有多對多的關係。

Play提供了一個我沒有用過的MongoDB插件。您也可以使用Casbah driver for MongoDB,我已經使用了很多並且非常優秀。如果您喜歡MongoDB,那麼查詢由FourSquare編寫的針對MongoDB的DSL的Rogue也值得一看。

MongoDB速度非常快。另外,你可以節省編寫模式的麻煩,因爲任何記錄都可以有你想要的任何字段,而且它們仍然可以搜索和索引。您的數據模型可能看起來很像現在的樣子,具有用戶「集合」(如表格)和其他具有根據需要引用用戶標識的記錄的集合。但是,如果您需要爲某個集合添加字段,則可以隨時執行此操作,而無需擔心較舊的記錄或數據遷移。技術上MongoDB記錄沒有模式,但最終會將類似的記錄組織到集合中。

MongoDB是我在過去幾年遇到的最有趣的技術之一。在那個愉快的星期六,我決定檢查一下,在15分鐘之內是有成效的,感覺就像我「明白了」。我經常在演示中演示如何在15分鐘內開始使用MongoDB和Scala,包括安裝MongoDB。這裏無恥的插頭,如果你到Web服務,是我在開始使用的MongoDB和Scalatra的使用卡斯巴博客文章:http://janxspirit.blogspot.com/2011/01/quick-webb-app-with-scala-mongodb.html

你應該至少是去http://try.mongodb.org

這就是讓我開始。

祝你好運!

+0

非常感謝細節。 mongodb可以用於像一個用戶對象的關係是另一個用戶對象的朋友和一對多關係嗎? – ace 2011-06-11 06:58:00

+0

是的,有一種從一個對象鏈接到另一個對象的通用格式,但您必須自己關注鏈接。關係數據庫中沒有連接。 – 2011-06-11 14:19:25

2

嗯,你想要非常高的遍歷性能,並使用單詞「朋友」。首先想到的是Graph Databases。他們是專門爲這個確切的案件。

嘗試Neo4j的http://neo4j.org/

它是免費的,開源的,但也有商業支持和商業許可,具有出色的文件,可以從許多語言(REST接口)進行訪問。

它是用java編寫的,所以你有本地庫或者你可以將它嵌入到你的java/scala應用程序中。

+0

感謝您的洞察。你能否告訴我neo4j是否可以免費用於商業用途而不需要我的項目是開源的?這從他們的網站是不明確的。 – ace 2011-06-11 06:55:34

+0

是的。如果應用程序用於公司內部使用,則是免費的。但是,如果您在網上爲客戶提供服務,那麼您必須開放源代碼或購買商業許可證。 – 2011-06-11 22:22:43

0

關於MongoDB或Cassendra,您現在(2016年12月,晚5年)嘗試longevityframework.org

使用標準Scala習慣用法(如案例類,伴隨對象,選項和不可變集合)構建您的領域模型。請告訴我們您的模型中的類型,並提供持久性。

請參閱「More Longevity Awesomeness with Macro Annotations!」從John Sullivan
他提供了一個example on GitHub

如果你以前看過長壽,你會驚訝於開始保持你的域對象變得容易。最好的部分是所有與持久性有關的東西都藏在註釋中。您的域類完全沒有持久性問題,可以完美地表達您的域模型,並可以在應用程序的所有部分中使用。