Mongo DB
https://blog.toright.com/posts/4552/mongodb-sharding-%E5%88%86%E6%95%A3%E5%BC%8F%E5%84%B2%E5%AD%98%E6%9E%B6%E6%A7%8B%E5%BB%BA%E7%BD%AE-%E6%A6%82%E5%BF%B5%E7%AF%87.html
MongoDB
NoSQL
第一招:Modeling One-to-Few 少量級關聯模式 (Embedding)
假設我們可以預期某個 Document 中的某個欄位所包含的複數子文件數量不多,可以稱為 One-to-Few 模式。如此「一個實體」對上「少少的實體」,通常的關聯數量可以落在 1000 以內,要注意整體 Document Size 不可以超過 16MB,把關聯的資料直接放在 Document 中的某個欄位,這樣的技巧我們稱為 Embedding。
第二招:One-to-Many 多量級關聯模式 (Child-Referencing)
假設主實體關聯的子項目數量比起上述的例子來得多一些,但可能在幾百筆上下。但是放在同一個 Document 又有機會超過 16MB 就爆了,另外可能還會考慮到資料獨立性的問題。遇到這樣的情況就是採用類似傳統 RDBMS 的正規化作法,將關聯的 Document 放在另一個 Collection,透過 Object ID 建立關聯,實際查詢時透過 Application-level Join 進行反查。如此便可以滿足大量子物件的一對多關係,並同時保持資料的獨立性。這樣的技巧我們稱為 Child-Referencing,
第三招:One-to-Squillions 海量級關聯模式 (Parent-Referencing)
海量級參照模式(大數據的最愛),如果主實體所參照的另一個實體可能是海量級,千以上的極大數字。如果用上面介紹的模式來實作,會遇到用來存放 ObjectID 的陣列爆表。遇到這樣的情況其實很簡單,就是反過來進行參照,實現 Parent-Referencing。像是下面的例子:
> db.hosts.findOne()
{
_id : ObjectID('AAAB'),
name : 'goofy.example.com',
ipaddr : '127.66.66.66'
}
>db.logmsg.findOne()
{
time : ISODate("2014-03-28T09:42:41.382Z"),
message : 'cpu is on fire!',
host: ObjectID('AAAB') // Reference to the Host document
}
實務上可以透過以下的方式進行 Query,比如要找出哪台機器的 log:
// find the parent ‘host’ document
> host = db.hosts.findOne({ipaddr : '127.66.66.66'}); // assumes unique index
// find the most recent 5000 log message documents linked to that host
> last_5k_msg = db.logmsg.find({host: host._id}).sort({time : -1}).limit(5000).toArray()
如何來選擇設計模式?最簡單可以透過估計 Document 的參照「基數」來決定。如果很少就直接放進 Document 做 One-to-Few (Embedding),有點多就將獨立到另一個 Collection 做 Child-Referencing。如要用來存放隨著時間爆炸性成長的資料,就可以選用 Parent-Referencing 模式。依據需求選用適合的設計才是最重要的
留言
張貼留言