MongoDB:用于搜索性能的嵌套值与单独的集合 - 数据库模式设计

Posted

技术标签:

【中文标题】MongoDB:用于搜索性能的嵌套值与单独的集合 - 数据库模式设计【英文标题】:MongoDB: Nested values vs separate collections for search performance - DB schema design 【发布时间】:2021-11-23 04:42:41 【问题描述】:

假设我有一个 MongoDB,其中我有单独的 texts,其中包含 statements

我需要能够搜索texts,它在statements 中有某些关键字(还有多个出现搜索词的文本)。

我还需要能够在特定用户添加的所有文本中找到所有statements,其中包含特定的搜索短语。

我的问题:我需要为statements 创建一个单独的集合还是可以简单地将它们嵌套添加到texts 集合中?

所以,选项 1(单独的集合):

文本集合


text: 
    name: 'nabokov',
    id: '1'

语句集合:

statement: 
    text_id: '1',
    id: '24',
    text: 'He opened the window and saw the sky`

选项 2(嵌套):


text: 
    name: 'nabokov',
    id: '1'
    statements: [
        id: '24',
        text: 'He opened the window and saw the sky`
    ]


如果我想根据关键字搜索分别检索语句并保留上下文数据(例如它们属于哪个文本等),哪种 MongoDB 存储架构更好

这将如何影响较大 DB(例如 > 100 Gb)的写入/读取速度。

我的文本将被限制为 16 Mb。

【问题讨论】:

option2 中的语句数组应该有多大(有多少成员)?这是决定的重要因素。大文档 => 较慢的更新(加载到内存中)=> 如果您经常更新它们会出现问题 @Takis_ 那里可能有数万条语句。您认为将它们写入单独的集合而不是文档中会更快吗? 我想是这样,但如果你想ask here also 给他们所有可能的信息,最好也问更有经验的人 【参考方案1】:

对于 MongoDB 文档架构设计 w.r.t.性能,有几个因素可能有助于考虑:

    集合之间关系的基数是什么? 集合中文档的预期数量/大小是多少? 最常用的查询是什么? 文档多久更新一次?

对于您的场景,我们实际上需要您提供更多上下文/详细信息来制定更明智的“答案”。但这里有一些我之前亲身经历过的常见场景,作为参考可能对你有用。

    text 作为不经常更新的根文档;大多数查询都基于statement 集合作为子集合。

在这种情况下,最好将text 文档反规范化并将字段name 复制到相应的statement 文档中。 例如

statement: 
    text_id: '1',
    text_name: 'nabokov',
    id: '24',
    text: 'He opened the window and saw the sky`

通过这种方式,您可以避免将$lookup 加入text 集合,从而提高性能,同时只需少量维护新的text_name 列的成本。由于text 文档无论如何都不会经常更新,因此成本很小。

    text 文档将仅与少量 statements 对象/文档相关联。

在这种情况下,选择选项 1 可能是个好主意(即将语句保存在 text 文档的数组中)。优点是您可以编写相当简单的查询,并避免维护另一个 statement 集合的成本。

这里是very good document 以了解有关 MongoDB 架构设计的更多信息。

【讨论】:

以上是关于MongoDB:用于搜索性能的嵌套值与单独的集合 - 数据库模式设计的主要内容,如果未能解决你的问题,请参考以下文章

我应该使用单独的集合还是嵌入我知道不会用于所有模型的字段。 MongoDB

嵌套结构如何影响 DocumentDB 查询性能?

用于预订、嵌套或引用的 MongoDB 模式?

用于预订、嵌套或引用的 MongoDB 模式?

使用and条件在mongodb文档的嵌套对象中搜索特定字符串

在 Mongodb 中查询嵌套模式?