與SQL爲相同邏輯使用外鍵相比,MongoDB在文檔中嵌入對象的能力有什麼特別的優勢嗎?MongoDB嵌入與SQL外鍵?
在我看來,唯一的優勢是易用性(也許性能?),甚至看起來它可以很容易地被抽象掉(例如,Django似乎很直觀地處理SQL的外鍵)。
與SQL爲相同邏輯使用外鍵相比,MongoDB在文檔中嵌入對象的能力有什麼特別的優勢嗎?MongoDB嵌入與SQL外鍵?
在我看來,唯一的優勢是易用性(也許性能?),甚至看起來它可以很容易地被抽象掉(例如,Django似乎很直觀地處理SQL的外鍵)。
這歸結爲是否嵌入的經典問題。
這裏有上手幾個環節之前,我解釋多一些:
現在更具體地回答。
您必須記住SQL:JOIN中的外鍵的服務器端用法。嵌入是一次往返以獲取單個文檔中所需的所有數據,但連接不是,它們實際上是基於範圍的兩個選擇,然後合併以省略重複(對於某些數據集有大量開銷)。
因此,外鍵的使用並不完全取決於應用程序,它也取決於服務器和數據庫。
這就是說有人誤解在MongoDB中嵌入並嘗試將所有數據放入一個文檔中。不幸的是,這是通過您應該總是試圖嵌入一切的常識來重新強化的。鏈接和更多將提供一些有用的指導。
現在我們清理一些東西嵌入在加入的主要優點是:
然而,實體嵌入有幾個缺陷:
post
可能會嵌入comments
,但由於查詢需要,user
可能不會嵌入posts
。所以,當使用正確的MongoDBs嵌入可以成爲SQL聯接的巨大力量,但你必須明白何時使用它的權利。
Mongo的核心優勢在於其數據文檔視圖,當然這可以擴展到數據的「POCO」視圖。像.NET中的NoRM Project這樣的Mongo客戶端與經驗豐富的Fluent NHibernate用戶看起來非常相似,這並非偶然 - 您的POCO數據模型簡單地序列化爲BSON並保存在Mongo 1:1中。無需映射。
總體而言,這兩種技術最大的區別在於模型以及開發人員如何思考他們的數據。 Mongo更適合於快速應用程序開發。
-1 NoRm沒有被積極開發...... OP也沒有提到.net在他的問題中 – Alex