2010-09-14 42 views
2

有產品的名稱和價格。你如何在MongoDB中建模?

用戶登錄他們購買的產品。

# option 1: embed logs 
product = { id, name, price } 
user = { id, 
     name, 
     logs : [{ product_id_1, quantity, datetime, comment }, 
       { product_id_2, quantity, datetime, comment }, 
       ... , 
       { product_id_n, quantity, datetime, comment }] 
} 

我喜歡這個。但是,如果產品id長12個字節,數量和日期時間是32位(4字節)整數,平均評論100個字節,則一個日誌的大小爲12 + 4 + 4 + 100 = 120個字節。文檔的最大大小爲4MB,因此每個用戶的最大日誌量爲4MB/120bytes = 33,333。如果假定用戶每天記錄10次購買,那麼4MB限制達到33,333/10 = 3,333天〜9年。那麼,9年可能是好的,但如果我們需要存儲更多的數據呢?如果用戶每天記錄100次購買會怎樣?

這裏有什麼其他的選擇?我是否必須完全正常化?

# option 2: normalized 
product = { id, name, price } 
log = { id, user_id, product_id, quantity, datetime, comment } 
user = { id, name } 

呃。我們回到了關係。

+0

爲什麼你需要的產品ID的12個字節裏面嵌入用戶使用此日誌?也許你可以使用32位(或更少)的序列? – diederikh 2010-09-14 13:59:12

+0

您也可以將註釋移到單獨的集合中,並通過id引用註釋。 – diederikh 2010-09-14 14:04:42

+0

哦,不錯..所以手動生成自動遞增的id?你會在哪裏存儲最後分配的ID值? – randomguy 2010-09-14 14:04:54

回答

0

是的,選項2是你最好的選擇。是的,你回到了關係模型,但是,你的數據是最好的模型。我沒有看到選項2有一個特別的缺點,它的數據需要你這樣做,而不是一個糟糕的設計過程。

3

如果尺寸是主要問題,您可以繼續使用mongo DbRef的選項2。

 logs : [{ product_id_1, quantity, datetime, comment }, 
      { product_id_2, quantity, datetime, comment }, 
      ... , 
      { product_id_n, quantity, datetime, comment }] 

,並使用Dbref中,像

 var log = {product_id: "xxx", quantity:"2", comment:"something"} 
     db.logs.save(log) 
     var user= { id:"xx" name : 'Joe', logs : [ new DBRef('logs ', log._id) ] } 
     db.users.save(user)