0

寻找有关设置 MongoDB 模式的一些指导。这是场景:

我正在为人们创建一个保存书签功能。在数据库中,我只需要存储用户名、标题和链接。由此,我需要创建一个输出 JSON 并查询特定书签或一个人的整个提要的服务。从实施和性能的角度来看,这两种设置中的哪一种更有意义?

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) 会更容易,因为我可以只做 a findOne(username)on the_id而不必在做 a 之后遍历每条记录find(username)并转换为数组和然后是 JSON(我认为这有点占用内存)。

另一方面,添加新书签将是 (B) 中的一个额外步骤,因为我必须获取记录,将新书签推入其中,然后保存。

4

1 回答 1

3

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

您的目标是通过尽可能少的搜索来满足用户的需求,因为每个文档查找都需要时间。当您不需要用户的所有书签而只需要特定的书签时,您始终可以使用点符号来访问对象检索字段的子集

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

因此,我建议您选择解决方案B)

于 2012-11-14T19:53:30.437 回答