2014-01-13 14 views

回答

4

面向文檔數據庫的目標是降低「阻抗不匹配」,即阻礙數據分離的程度,以便與運行時駐留在內存中的實際對象匹配某種數據庫模式。通過使用一個文檔,整個對象被序列化到磁盤上,而不需要在多個表中分割並在檢索時將它們連接在一起。

這就是說,鏈接文檔與引用文檔相同。他們只是表達同一事物的兩種方式。在查詢時間如何解決這些鏈接從一個數據庫實現到另一個不同。

這就是說,嵌入式文檔僅僅是存儲父級內部與父類型相關的對象類型的行爲。例如,我有一個類如下:

class User 
{ 
    string Name 
    List<Achievement> Achievements 
} 

Achievement是任意類(它的內容並不重要,在這個例子中)。

如果我保存這個使用鏈接的文件,我會的成果收集保存在用戶收集UserAchievement與成績,爲用戶被鏈接到成果集合中的Achievement對象的列表。這需要在數據庫引擎本身中發生某種聯接過程。但是,如果使用嵌入式文檔,則只需將User保存在User文檔中Achievements的Users集合中。用於嵌入文檔數據的

JSON表示會看(大致)是這樣的:

{ 
    "name":"John Q Taxpayer", 
    "achievements": 
     [ 
      { 
       "name":"High Score", 
       "point":10000 
      }, 
      { 
       "name":"Low Score", 
       "point":-10000 
      } 
     ] 
} 

而鏈接的文檔可能是這個樣子: { 「名」:「約翰·Q納稅人」 「政績」: [ 「somelink1」, 「somelink2」 ] }

內的成就收藏 { 「somelink1」: { 「名」: 「高分數」, 「點」:10000 } 「somelink2」: { 「名」: 「高分數」, 「點」:10000 } }

請記住這些只是近似表示。

所以總結一下,鏈接文檔的功能非常像RDBMS PK/FK關係。這允許一個集合中的多個文檔引用另一個集合中的單個文檔,這可以幫助對存儲的數據進行重複數據刪除。但是它增加了一層複雜性,要​​求數據庫引擎進行多個磁盤I/O調用,以形成最終文檔以返回給用戶代碼。嵌入式文檔與內存中的對象更加匹配,這可以降低阻抗不匹配,並且(理論上)減少磁盤I/O調用的數量。

您可以在阻抗不匹配這裏讀了起來:http://en.wikipedia.org/wiki/Object-relational_impedance_mismatch

UPDATE

,我要補充的是選擇實施適合您需要的正確的數據庫是從一開始就非常重要。如果您對每個數據庫有很多疑問,那麼聯繫每個供應商並獲取他們的一些培訓材料可能是有意義的。 MongoDB提供2門免費課程,您可以通過MongoDB University瞭解有關其產品和最佳用途的更多信息。 OrientDB確實提供培訓,但它不是免費的。最好是直接聯繫他們並進行一些售前培訓(如果您想要獲得數據庫授權),通常他們會讓您聯繫某種售前顧問來幫助您評估他們的產品。

2

MongoDB的工作方式與RDBMS相似,對象標識就像外鍵。這意味着運行時間很昂貴的「JOIN」。相反,OrientDB具有僅創建一次並且運行時成本非常低的直接鏈接。