標籤:
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.在進行反範式設計時請先確認讀寫比。一個幾乎不更改只是讀取的欄位才適合冗餘到其他對象中。
mongodb資料庫設計原則