【问题标题】:MongoDB schema for JSON feed用于 JSON 提要的 MongoDB 架构
【发布时间】:2012-11-03 08:58:45
【问题描述】:

寻找有关设置 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) 会更容易,因为我可以在 _id 上执行 findOne(username) 而不必在执行后遍历每条记录find(username) 并转换为数组,然后转换为 JSON(我认为这有点占用内存)。

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

【问题讨论】:

    标签: performance mongodb schema


    【解决方案1】:

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

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

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

    所以我建议你选择解决方案 B)

    【讨论】:

    • 谢谢,这确实有道理。一个后续问题。我编辑了我的原始 (B) 示例,以便每个书签都有自己的键,而不是在列表中。原因是我可以像你说的那样使用点符号来更新/删除书签。我将如何使用 mongoId() 为每个书签创建唯一键?我可以将任何字符串传递给 mongoId() 吗?如果我每次都传递相同的字符串,mongoId() 是否仍然是唯一的?
    • 我不使用 mongoid。但是您可以继续使用数组。有 $ positional operator 引用触发您的查找查询的数组条目。
    • 顺便说一句,目前嵌套数组时不能使用位置运算符。但是有一个开放的 bugtracker 问题:jira.mongodb.org/browse/SERVER-831
    • 谢谢,我也看到了这个错误,这就是我最初从列表切换的原因。我确实设法让mongoid 工作(至少在 PHP 中你不必传递任何东西,它只会生成一个对象,然后你可以将其用作键的字符串)。感谢您的帮助!
    猜你喜欢
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多