我想设计一个带有一些消息的用户结构,但我不知道用于消息的哪种关系: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"),
},
答案 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
}]
}