创建新集合与数组属性

时间:2013-12-16 22:18:53

标签: mongodb

来自MySQL的背景,我在使用Mongo时一直在质疑一些设计模式。我一直在问自己的一个问题是我应该何时创建新集合与创建数组类型的属性?我现在的情况如下:

  • 我有一组拥有至少1个收件箱的用户
  • 每个收件箱都有0条或更多条消息
  • 每封邮件可以有0条或评论

我目前的结构如下:

{
username:"danramosd",
inboxes:[
    {
        name:"inbox1",
        messages:[
            {
                message:"this is my message"
                comments:[
                    {
                        comment:"this is a great message"
                    }
                ]
            }
        ]

    }
]
}

为简单起见,我只列出了1个收件箱,1条消息和1条评论。实际上可能会有更多。

我认为更好用的方法是使用4个集合:

  • 用户 - 只存储用户名
  • 收件箱 - 收件箱的名称,以及它所属的用户的UID
  • 消息 - 消息的内容,以及它所属的收件箱的UID
  • 评论 - 评论的内容,以及评论所属消息的UID。

那么哪种方法更好?

1 个答案:

答案 0 :(得分:1)

没有人可以帮助您解决这个问题,因为它高度依赖于您的应用程序:

  • 您平均拥有多少个收件箱/消息/评论
  • 您多久编写/修改/删除这些元素
  • 你多久阅读一次
  • 我忘记提及的很多其他事情

当你选择一种方法而不是另一种方法时,你正在进行交易。

如果您将所有内容存储在一起(在一个集合中作为您的第一个案例),您可以非常轻松地获取特定用户的所有内容。把你最不可能同时需要所有信息的东西拆开,同时让你更难以更新元素的某些部分(尝试写一个会添加注释或删除第三条注释的查询) 。即使这很容易 - mongodb does not handle well growing documents,因为无论何时超过padding factor,它都会将文档移动到另一个位置(这很昂贵)并增加填充因子。另请注意,这可能会触及mongodb的limit on the size of the document

在尝试设计任何存储架构之前,最好先阅读所有mongodb用例。毫不奇怪,他们也有一个全面的overview of your case