20

在工作中,我們最近開始使用CouchDB(一種面向文檔的數據庫)的項目。我一直都很難學習所有的關係數據庫知識。如何停止思考「關係」

我想知道你們有些人克服了這個障礙嗎?你是如何停止關係思考並開始思考的文件(我爲彌補這個詞而道歉)。

有什麼建議嗎?有幫助的提示?

編輯:如果它有什麼區別,我們使用Ruby & CouchPotato連接到數據庫。

編輯2:這讓我很難接受答案。我認爲,我選擇了幫助我學習最多的那個。但是,我想,沒有真正的「正確」答案。

+5

你不可能知道關係型數據庫知識。這是那些有很多錯誤信息被認爲是合法的主題之一。曾閱讀克里斯日期書?如果你有,你可能不會嘗試使用CouchDB。你會更清楚。 – Breton 2009-06-25 13:26:14

+0

也就是說,假設你有一張名爲「documents」的表格,其中包含儘可能多的自動生成的列,並且我認爲你有一個很好的近似值:特定領域的數據庫(Think blogs) – Breton 2009-06-25 13:32:23

+0

@Brenton - 嘿,嘿!讓你的事實正確。這是C J給你的日期。 :) – 2009-06-25 13:40:58

回答

12

我想,在仔細閱讀關於這個主題的幾頁之後,這一切都取決於您處理的數據類型。

RDBMSes表示一種自上而下的方法,數據庫設計人員將聲明數據庫中存在的所有數據的結構。你定義一個人有第一個,最後一個,中間名和一個家庭住址等,你可以使用RDBMS強制執行此操作。如果你沒有一個人的HomePlanet專欄,那麼很難運氣的人會擁有與地球不同的HomePlanet;您將不得不在以後的日期添加列,或者數據不能存儲在RDBMS中。大多數程序員總是在他們的應用程序中做這樣的假設,所以這不是一個愚蠢的事情來承擔和執行。定義事物可能很好。但是,如果將來需要記錄其他屬性,則必須添加它們。關係模型假定您的數據屬性不會有太大變化。

使用諸如MapReduce之類的「Cloud」類型數據庫(在您的情況下爲CouchDB)不做上述假設,而是從下往上查看數據。數據輸入到文檔中,文檔可以具有任意數量的不同屬性。它假設你的數據,根據其定義,它可能具有的屬性類型是多樣的。它說:「我只知道我在數據庫Person中擁有一個HomePlanet屬性爲」Eternium「和」Lord Nibbler「的FirstName但沒有LastName的文檔。這個模型適合網頁:所有的網頁都是一個文檔,但是文檔的實際內容/標籤/關鍵字廣泛存在,所以您無法將它們納入數據庫管理系統從高處認可的剛性結構中。這就是爲什麼谷歌認爲MapReduce模型成爲業內人士的原因,因爲谷歌的數據集非常多樣化,需要從一開始就模糊不清,而且由於大量數據集能夠利用並行處理(MapReduce使得微不足道) 。文檔數據庫模型假定您的數據的屬性可能會/會變化很多,或者由於「間隙」和大量稀疏填充的列(如果數據存儲在關係數據庫中可能會發現)而變得非常多樣。雖然你可以使用RDBMS來存儲這樣的數據,但它會變得很難看。

要回答你的問題,那麼當你看到一個使用MapReduce範例的數據庫時,你根本不會想到「關係」。因爲它實際上並沒有強制關係。這是一個概念性的駝峯,你只需要克服。


一個很好的文章中,我遇到了那個比較和對比兩個數據庫相當不錯的MapReduce: A Major Step Back,它認爲,MapReduce的範例數據庫是一個技術倒退,而且不如RDBMS中。我不得不不同意作者的論文,並認爲數據庫設計人員只需爲他/她的情況選擇合適的人。

1

一個可以嘗試的事情是得到一份firefox和firebug的副本,並玩地圖減少在javascript中的功能。它們實際上是相當冷靜和樂趣,而且似乎是如何把事情CouchDB中

完成的基礎這裏的喬爾對這個問題的小文章:http://www.joelonsoftware.com/items/2006/08/01.html

9

它的所有有關的數據。如果您有關係最有意義的數據,則文檔存儲可能沒有用處。一個典型的基於文檔的系統是一個搜索服務器,你有一個龐大的數據集,並希望找到一個特定的項目/文檔,該文檔是靜態的或版本化的。

在歸檔類型的情況下,文檔可能實際上是文檔,不會更改並且結構非常靈活。將元數據存儲在關係數據庫中是沒有意義的,因爲它們都非常不同,所以很少有文檔可以共享這些標籤。基於文檔的系統不存儲空值。

非關係/類文檔數據在非規格化時很有意義。它變化不大,或者你不關心一致性。

如果你的用例適合一個關係模型,那麼它可能不值得把它壓縮到一個文檔模型中。

這是一篇關於non relational databases的好文章。

另一種考慮它的方式是,一個文檔是一排。關於文檔的所有內容都在該行中,並且該文檔是特定的。行很容易分割,因此縮放比較容易。

5

在CouchDB中,就像Lotus Notes一樣,您不應該將文檔視爲與行相似。

相反,文檔是關係(表)。

每個文檔都有的行數 - 字段值:

ValueID(PK) Document ID(FK) Field Name  Field Value 
======================================================== 
92834756293 MyDocument  First Name  Richard 
92834756294 MyDocument  States Lived In TX 
92834756295 MyDocument  States Lived In KY 

每個View是一個交叉表查詢跨越一個巨大的UNION選擇每一個文檔中的所有的。

所以,它仍然是關係型的,但並不是最直觀的意義,也不是最重要的意義:良好的數據管理實踐。

4

面向文檔的數據庫不會拒絕關係的概念,它們只是有時讓應用程序解引用鏈接(CouchDB),甚至直接支持文檔之間的關係(MongoDB)。更重要的是DODB是無模式的。在基於表格的存儲中,可以通過顯着的開銷實現這個屬性(參見richardtallent的答案),但是在這裏它的效率更高。從RDBMS切換到DODB時,我們應該學會的是忘記表格並開始考慮數據。這就是綿羊模擬器稱之爲「自下而上」的方法。這是一個不斷髮展的模式,而不是預定義的Procrustean牀。當然,這並不意味着圖式應該以任何形式被完全拋棄。您的應用程序必須解釋數據,以某種方式限制其形式 - 這可以通過將文檔組織到集合中,通過使用驗證方法創建模型來完成 - 但現在這是應用程序的工作。