2010-10-20 55 views
1

從我對這兩個「不僅SQL」數據庫的理解。他們搜索每個記錄並將其傳遞給您編寫的JavaScript函數,通過查看每個記錄來計算返回的結果。CouchDB和MongoDB真的使用JavaScript搜索每個文檔?

實際上它是如何工作的?聽起來比使用沒有任何索引鍵的普通RBMS更糟糕。

我構建了我的模式,因此它們不需要連接操作,這使我在索引int列上進行簡單搜索。換句話說,這些列位於RAM中,通過它們的快速值檢查(WHERE user_id IN (12,43,5,2)revision = 4)爲數據庫提供了一個簡單的ID列表,用於在海量數據收集的實際行中查找ID。

所以我試圖想象如何在世界上通過查看數據庫中的每一行可以被認爲是可以接受的(如果的確如此)。也許有人可以糾正我,因爲我知道我必須失去一些東西。

回答

2

@Xeoncross

我建我的模式,使他們不需要加入這讓我對索引的INT列的簡單的搜索操作。換句話說,列在RAM和快速值檢查通過他們(WHERE user_id IN(12,43,5,2)或修訂版= 4)

那麼,你會愛上MongoDB。 MongoDB支持索引,因此您可以索引user_id和revision,並且此查詢將能夠相對較快地返回。

但是,請注意,許多NoSQL數據庫只支持密鑰查找,不一定支持「二級索引」,因此您必須爲此做一些功課。

所以我試圖想象如何在數據庫中查看每一行可以被認爲是可以接受的(如果的確如此)。

那麼,如果你在運行一個基於SQL的數據庫查詢,你沒有這樣的數據庫將執行表掃描(即:通過每一行看)的索引。

他們搜索每個記錄並將其傳遞給您編寫的JavaScript函數,該函數通過查看每個記錄來計算返回的結果。

所以實際上大多數NoSQL數據庫都支持這個。但請不要將它用於實時查詢。此選項主要用於執行用於彙總數據的map-reduce操作。

下面是對NoSQL的不同看法。 SQL在關係操作方面非常出色,但關係操作的伸縮性並不好。許多NoSQL專注於面向Key-Value/Document的概念。

SQL的工作原理是您希望標準化非重複數據,並且您要以大集合來獲取數據。 NoSQL的工作原理是,您希望快速查詢某些「塊」數據,但是您願意等待數據依賴「大集合」(在後臺運行映射 - 縮減)。

這是一個很大的權衡,但如果在現代Web應用程序上有很多意義。大部分時間用於加載一個頁面(博客文章,wiki條目,SO問題),大部分數據都與這個元素相關聯或「懸掛」。因此,通過一個查詢水平可伸縮查詢獲取所需的所有內容的概念非常有用。

這不是一切的解決方案,但它是很多用例的一個非常好的選擇。

+1

謝謝你的完整答案。由於MongoDB支持二級索引,因此不再有問題。我在看CouchDB,它似乎只支持主鍵,這使得它看起來很沒用。 MongoDB似乎是要走的路,因爲它具有普通SQL數據庫的大部分功能,不包括連接和事務(我也不使用它們)。 – Xeoncross 2010-10-21 15:26:51

+0

是的,我更喜歡MongoDB!我設置它並在10分鐘內編寫它(包括閱讀示例教程)。 – bbqchickenrobot 2010-10-21 18:35:20

1

你應該學習他們了多一點。這不是「更壞」,而是RDMBS 不同 ......實際上,給定某些域/功能,「NoSQL」模式比傳統模式快得多,在某些意見中,RDMBS實現過時了。想想谷歌的Big Table平臺,你會得到MongoDB,Riak,CouchDB,Cassandra(Facebook)以及其他許多人正在努力完成的任務。主要區別在於這些NoSQL解決方案中的大多數都集中在Key/Value存儲(有些人稱之爲「文檔」數據庫),並且限於沒有關係概念(在主要/外鍵方面)和聯接。在表上加入操作可能非常昂貴。另外,我們不要忘記對象關係阻抗不匹配問題......您不需要ORM來訪問MongoDB。它實際上可以將您的代碼對象(或文檔)存儲在內存中。你能想象在代碼和複雜性方面的節省! db4o是另一種輕量級解決方案。

當你說「不僅SQL」數據庫時,我不知道你的意思嗎?這是一個NoSQL範例 - 其中不用SQL查詢系統的底層數據存儲。 NoSQL還意味着不是一般建立在SQL之上的RDBMS。儘管MongoDB在檢索數據時有一種類似SQL的語法,可以從.NET中使用 - 它被稱爲NoRM。

我會說我真的只和Riak和MongoDB合作過......我不太瞭解Cassandra或CouchDB過去的閱讀水平和功能集合理解。我更喜歡使用MongoDB。 Riak也很好,但不是我所需要的。您應該下載這些NoSQL解決方案中的一部分,您將獲得這個概念。查看db4o,MongoDB和Riak,因爲我發現它們是對基於.NET的語言提供更多支持的最簡單方法。這對於某些應用程序來說是有意義的。總而言之,NoSQL或Document數據庫或OODBMS ......無論您想要調用它,都非常有吸引力,並且獲得了大量移動。

我也忘了你的JavaScript的問題... MongoDB的具有JavaScript的「綁定」,使它能夠被用作一個方法進行數據搜索。 Riak通過JSON格式處理數據。我相信MongoDB使用BSON,我不記得其他人使用什麼。無論如何,重點不在於SQL(結構化查詢語言)向數據庫「詢問」其中某些(MongoDB是否爲)信息,而是使用Javascript和/或RESTful語法向NoSQL系統詢問數據。我相信CouchDB和Riak可以通過HTTP進行查詢,這使得它們非常容易訪問。更何況,這很酷。

做你的研究....下載它們,它們都是免費的和OSS。

的db4o:http://www.db4o.com/(Java的& .NET版本)

的MongoDB:mongodb.org/

了Riak:http://www.basho.com/Riak.html

規範:http://thechangelog.com/post/436955815/norm-bringing-mongodb-to-net-linq-and-mono

2

在CouchDB中的條款,地圖功能可以是Javascript,但它也可以是Erlang。 (或另一種語言,如果你拉入第三方查看服務器)

此外,視圖是增量計算的。換句話說,映射函數在創建時在數據庫中的所有文檔上運行,但對數據庫的進一步更新僅影響視圖的相關部分。

視圖的內容在某些方面類似於RDBMS中的索引字段。輸出是一組可以非常快速地搜索的鍵/值對,因爲它們存儲爲b樹,有些RDBMS用它來存儲它們的索引。