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