寻找设置MongoDB架构的一些指导。这是场景:
我正在为人们创建一个保存书签功能。在数据库中,我需要存储的只是用户名,标题和链接。由此,我需要创建一个输出JSON并查询特定书签或人的整个Feed的服务。从实现和性能角度来看,这两个设置中的哪一个更有意义?
A)每个书签都是它自己的对象:
{
"_id": ObjectId("abcd1234"),
"username": "Choy",
"title": "This is my first link",
"url": "http://www.google.com"
},
{
"_id": ObjectId("abcd1234"),
"username": "Choy",
"title": "This is my second link",
"url": "http://www.bing.com"
}
B)每个用户都是自己的对象:
{
"_id": "Choy",
"bookmarks": {
"abcd1234": {
"title": "This is my first link",
"url": "http://www.google.com"
},
"abcd12345": {
"title": "This is my second link",
"url": "http://www.bing.com"
}
}
}
最初(A)对我来说更有意义,因为我可以轻松查询特定书签,更新并删除它。但是从应用程序的角度来看,当我想列出一个人的所有书签时,(B)会更容易,因为我可以在findOne(username)
上执行_id
而不必遍历每个书签在执行find(username)
并转换为数组然后转换为JSON(我认为有点内存密集)后记录。
另一方面,在(B)中添加新书签将是一个额外的步骤,因为我必须获取记录,将新书签推入其中然后保存。
答案 0 :(得分:3)
当你在MongoDB中有一个has-a关系时,通常最好将数据嵌入拥有它的对象中。
您的目标是通过尽可能少的搜索来满足用户的需求,因为每次单个文档查找都需要花费时间。如果您不需要用户的所有书签,只需要特定的书签,则可以始终use the dot notation to reach into objects和retrieve subsets of fields。
当您删除或重命名用户时,聚合而不是关系也很有用。 MongoDB不能像SQL数据库那样自动级联,所以在这种情况下你必须自己处理任何孤立的数据。但是当用户文档是自包含的时,这不会是一个问题。
所以我建议你去解决 B)。