MongoDB:嵌套值与单独集合的搜索性能 - 数据库架构设计

MongoDB: Nested values vs separate collections for search performance - DB schema design

假设我有一个 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 存储模式更好

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

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

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

  1. 集合之间关系的基数是多少?
  2. 集合中预期的 number/size 文档是多少?
  3. 最常用的查询是什么?
  4. 文档多久更新一次?

对于您的场景,我们实际上需要您提供更多上下文/详细信息才能得出更明智的“答案”。但这里有一些我个人以前遇到过的常见场景,可能对你有用作为参考。

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

在这种情况下,将 text 文档非规范化并将字段 name 复制到相应的 statement 文档中可能是个好主意。 例如

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

通过这种方式,您可以通过避免对 text 集合使用 $lookup 来提高性能,同时维护新的 text_name 列的成本很小。由于 text 文档不会经常更新,因此成本很小。

  1. 一个 text 文档将只与少量 statements objects/documents 关联。

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

集合的成本。

这里是 very good document 阅读更多关于 MongoDB 架构设计的信息。