【问题标题】:How would you model this in MongoDB?您将如何在 MongoDB 中对此进行建模?
【发布时间】:2010-09-14 13:52:33
【问题描述】:

有些产品有名称和价格。

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

# 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字节)整数,cmets平均100字节,那么1条日志的大小是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 }

嗯。我们回到了关系。

【问题讨论】:

  • 为什么产品 ID 需要 12 个字节?也许您可以使用 32 位(或更少)的序列?
  • 您还可以将 cmets 移动到单独的集合中,并通过 id 引用 cmets。
  • 哦,太好了..所以通过自动递增手动生成ID?您会将最后分配的 id 值存储在哪里?
  • @Diederik,将 cmets 移出将是一笔大买卖!但我想这需要进行两次查询才能获取日志及其 cmets。

标签: mongodb database-design database-schema nosql


【解决方案1】:

如果大小是主要问题,您可以使用 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)

【讨论】:

    【解决方案2】:

    是的,选项 2 是您的最佳选择。是的,您回到了关系模型,但是,您的数据最好以这种方式建模。我看不出选项 2 有什么特别的缺点,它是你的数据要求你这样做,而不是一个糟糕的设计过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 2020-08-11
      • 1970-01-01
      • 2011-01-05
      相关资源
      最近更新 更多