设计mongodb架构使用嵌入还是引用?

时间:2013-11-17 10:00:51

标签: mongodb reference

我想设计一个带有一些消息的用户结构,但我不知道用于消息的哪种关系:embed或reference?

有这样的结构:

使用嵌入:

{
    "_id" : ObjectId("5285a6449df8156c1b000fa3")
    "name" : "Lee NC",
    "message" : [{
            "_id" : ObjectId("5285a6449df8156c1b0002ed"),
            "message" : "message 1",
            "date" : ISODate("2013-11-15T04:42:43.0Z"),
        }, {
            "_id" : ObjectId("5285a6669df8156012000be0"),
            "message" : "message 2",
            "date" : ISODate("2013-11-15T04:43:17.0Z"),

        },
        ..........................................
        ..........................................
        {
            "_id" : ObjectId("5285a6669df8156012000be2"),
            "message" : "message N",
            "date" : ISODate("2013-11-15T04:43:17.0Z"),

        },
    ]
}

或使用“参考”

user= {
        "_id" : ObjectId("5285a6449df8156c1b000fa3")
        "name" : "Lee NC",
        "message" : [{
                "message_id" : ObjectId("5285a6449df8156c1b0002ed")
            }, {
                "message_id" : ObjectId("5285a6669df8156012000be0")

            },
            ..........................................
            ..........................................
            {
                "message_id" : ObjectId("5285a6669df8156012000be2")

            },
        ]
    }

  message={
                "_id" : ObjectId("5285a6449df8156c1b0002ed"),
                "message" : "message 1",
                "date" : ISODate("2013-11-15T04:42:43.0Z"),
            },

2 个答案:

答案 0 :(得分:2)

我建议您将邮件保存为单独的文档。

原因是MongoDB对于随时间增长的文档效果不佳。

出于性能原因,MongoDB将每个文档保存在数据库文件的连续区域中。这意味着当文档增长超过其原始大小时,MongoDB必须为其重新分配新的磁盘空间并将其移动到那里。必须始终这样做才能真正降低写入性能。

我还认为您很少需要所有给定用户的消息。通常你只想要未读的或你想要对它们进行分页。两者都不适用于嵌入式阵列。

答案 1 :(得分:-1)

我强烈推荐嵌入,它意味着更少调用mongo,它更干净,推荐的方法是创建与您的视图相关的单个文档。

Mongo db默认允许每个文档16兆。因此,对于两个人的消息传递,这将意味着嵌入了大约3000万条短消息。

我刚刚使用以下架构实现了消息传递架构。这支持每个用户的顶级消息概述屏幕,然后支持每个消息的消息线程。一切都很好。

{

"FromUserId" : Number,
"ToUserId" : Number,
"FromStatus" : Number,
"ToStatus" : Number,
"Preview" : String,
"Sent" : Date,
"Read" : Date,
"ToUsername" : String,
"FromUsername" : String,
"Messages" :[{
    "FromUserId" : Number,
    "ToUserId" : Number,
    "FromStatus" : Number,
    "ToStatus" : Number,
    "MessageContent" : String,
    "IP" : String,
    "Sent" : Date,
    "Read" : Date,
    "RelId" : Date
    }]

}