2014-08-29 34 views
6

據我所知,連接在文檔數據庫中不可能或不可靠。我來自關係數據庫背景,並試圖瞭解如何處理這種情況。如果沒有JOIN,在文檔數據庫中處理數據的正確方法是什麼?

比方說,我有一個Employees集合,用於存儲所有員工相關信息。下面是一個典型的員工文件:

{ 
    "id": 1234, 
    "firstName": "John", 
    "lastName": "Smith", 
    "gender": "Male", 
    "dateOfBirth": "3/21/1967", 
    "emailAddresses":[ 
     { "email": "[email protected]", "isPrimary": "true" }, 
     { "email": "[email protected]", "isPrimary": "false" } 
    ] 
} 

我們也可以說,我有一個單獨的項目集合,其中我將項目數據存儲,看起來就像是:如果我想返回一個列表

{ 
    "id": 444, 
    "projectName": "My Construction Project", 
    "projectType": "Construction", 
    "projectTeam":[ 
     { "_id": 2345, "position": "Engineer" }, 
     { "_id": 1234, "position": "Project Manager" } 
    ] 
} 

在我的所有項目和項目團隊中,我如何處理確保我返回團隊中個人的所有相關信息,例如全名,電子郵件地址等?

這是兩個單獨的查詢嗎?一個用於項目,另一個用於ID出現在項目集合中的人員?

如果是這樣,我該如何插入關於人們的數據,例如全名,電子郵件地址?然後在我的應用程序中做一個foreach循環來更新數據嗎?

如果我依靠我的應用程序來處理所有相關數據的填充,這是不是會影響文檔數據庫(如MongoDB)的性能優勢?

感謝您的幫助。

回答

7

「......我該如何處理,確保我返回了團隊中個人的所有相關信息,例如全名,電子郵件地址等?是兩個單獨的查詢嗎?」

它可以是2個獨立的查詢,或者你非規範化到項目文檔。在我們的應用程序中,我們執行第二個查詢並儘可能在文檔中將數據標準化。

實際上,在頂層文檔中的任何地方都看不到「_id」鍵。此外,對於您將擁有數百萬個文檔的集合,您可以通過保留鍵「簡潔」來節省存儲空間。考慮「name」而不是「projectName」,「type」而不是「projectType」,「pos」而不是「position」。它似乎微不足道,但它加起來。您還需要在「team.empId」上放置索引,以便查詢「Joe平均工作的項目數量」運行良好。

{ 
    "_id": 444, 
    "name": "My Construction Project", 
    "type": "Construction", 
    "team":[ 
    { "empId": 2345, "pos": "Engineer" }, 
    { "empId": 1234, "pos": "Project Manager" } 
    ] 
} 

另一件事習慣是,你不必要更新單個字段,或者說,一個新的成員加入到球隊每次寫整個文件。您可以執行唯一標識文檔的目標更新,但只更新單個字段或數組元素。

db.projects.update(
    { _id : 444 }, 
    { $addToSet : "team" : { "empId": 666, "position": "Minion" } } 
); 

這兩個查詢一開始就讓一件事情感到痛苦,但你會過去它。

+0

非常感謝你們! – Sam 2014-08-29 18:25:18

0

Mongo DB是一個文檔存儲數據庫。 它支持高可用性和可伸縮性。

根據我的理解,爲了返回所有項目和項目團隊(詳細信息), 的列表,您將不得不運行2個查詢。 由於mongoDb沒有FK限制,我們需要在程序級別進行維護。 而不是FK約束, 1)如果數據較少,那麼我們可以將數據作爲子文檔嵌入。 2)而不是規範化的數據庫設計方式,在MongoDb中我們需要根據訪問模式進行設計。即我們需要更可能查詢數據的方式。 (然而,更新的時間更多(較慢),但在用戶端,性能主要取決於讀取活動,這會比RDBMS更好)

以下鏈接提供了免費的mongo Db證書課程。 Mongo DB University 他們也有一個論壇,這是非常好的。

相關問題