用于JSON提要的MongoDB架构

时间:2012-11-14 19:35:31

标签: performance mongodb schema

寻找设置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)中添加新书签将是一个额外的步骤,因为我必须获取记录,将新书签推入其中然后保存。

1 个答案:

答案 0 :(得分:3)

当你在MongoDB中有一个has-a关系时,通常最好将数据嵌入拥有它的对象中。

您的目标是通过尽可能少的搜索来满足用户的需求,因为每次单个文档查找都需要花费时间。如果您不需要用户的所有书签,只需要特定的书签,则可以始终use the dot notation to reach into objectsretrieve subsets of fields

当您删除或重命名用户时,聚合而不是关系也很有用。 MongoDB不能像SQL数据库那样自动级联,所以在这种情况下你必须自己处理任何孤立的数据。但是当用户文档是自包含的时,这不会是一个问题。

所以我建议你去解决 B)