1.一對很少 one-to-few 可以采用內嵌文檔
person集合中
{
name:'張三',
age:20,
address:[
{country:"中國",province:"山西省",city:"長治市"},
{country:"中國",province:"山西省",city:"太原市"}
]
}
優點:不需要單獨執行一條語句去獲取內嵌的內容
缺點:法把這些內嵌文檔當做單獨的實體去訪問
適用場合:一對很少且不需要單獨訪問內嵌內容
2.一對許多(但並不是很多) one-to-many 中間引用
person集合
{
_id:ObjectID(12個字節組成)
name:"張三"
age:23
}
人員組集合
{
name:"一組",
persons:[
ObjectID("aaaaa"),
ObjectID("AAABBB")
.....
]
}
適用場合:一對多且多的一端內容因為各種理由需要單獨存在的情況下可以通過數組的方式引用多的一方的。
3.一對非常多 one-to-squillions 父級引用(mongodb每個文檔的最大16M)
company集合
{
_id:ObjectID("company01")
name:"可為時代"
}
員工集合
{
name:"張三",
age:23,
company:ObjectID("company01")
}
適用場合:一對非常多的情況下,請將一的那端引用嵌入進多的一端對象中。
4.雙向關聯 在one端和many端同時保存對方的引用
person集合
{
_id:ObjectID("person01"),
name:"張三",
age:23,
group:ObjectID("group01")
}
group集合
{
_id:ObjectID("group01"),
name:"研發一組",
persons:[
ObjectID("person01")
ObjectID("person02")
]
}
優點:具有一對多的所有優點,同時在多的一方,可以很快找到少的一方
缺點:更新時需要同時更新兩個集合中的引用,不能使用原子性
5.反范式
反范式Many-<one :冗余mony端的數據到one端即在one的一方保存mony的引用集合
反范式noe -<many :冗余one端的數據到many端即在many的一方保存one的引用
使用場合:讀比較高,更新比較少的情況(沒有原子性)
7.總的設計原則
a.優先考慮內嵌,除非有什么迫不得已的原因。
b.需要單獨訪問一個對象,那這個對象就不適合被內嵌到其他對象中。
c.數組不應該無限制增長。如果many端有數百個文檔對象就不要去內嵌他們可以采用引用ObjectID的方案;如果有數千個文檔對象,那么就不要內嵌ObjectID的數組。該采取哪些方案取決於數組的大小。
d.在進行反范式設計時請先確認讀寫比。一個幾乎不更改只是讀取的字段才適合冗余到其他對象中。