你会如何在MongoDB中对此进行建模?

时间:2010-09-14 13:52:34

标签: mongodb database-design database-schema nosql

有些产品有名称和价格。

用户登录他们购买的产品。

# 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次购买,则在33,333 / 10 = 3,333天〜9年内达到4MB限制。好吧,9年可能还不错,但如果我们需要存储更多数据呢?如果用户每天记录100次购买该怎么办?

这里的另一个选择是什么?我是否必须将其完全正常化?

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

咩。我们又回到了关系中。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

是的,选项2是您最好的选择。是的,您回到关系模型,但是,您的数据最好以这种方式建模。我没有看到选项2的特殊缺点,它的数据要求你采用这种方式,而不是糟糕的设计过程。