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。性能,有几个因素可能有助于考虑:
- 集合之间关系的基数是多少?
- 集合中预期的 number/size 文档是多少?
- 最常用的查询是什么?
- 文档多久更新一次?
对于您的场景,我们实际上需要您提供更多上下文/详细信息才能得出更明智的“答案”。但这里有一些我个人以前遇到过的常见场景,可能对你有用作为参考。
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
文档不会经常更新,因此成本很小。
- 一个
text
文档将只与少量 statements
objects/documents 关联。
在这种情况下,选择选项 1 可能是个好主意(即,将语句保存在 text
文档的数组中)。优点是您可以编写相当简单的查询并避免维护另一个 statement
.
集合的成本。
这里是 very good document 阅读更多关于 MongoDB 架构设计的信息。
假设我有一个 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。性能,有几个因素可能有助于考虑:
- 集合之间关系的基数是多少?
- 集合中预期的 number/size 文档是多少?
- 最常用的查询是什么?
- 文档多久更新一次?
对于您的场景,我们实际上需要您提供更多上下文/详细信息才能得出更明智的“答案”。但这里有一些我个人以前遇到过的常见场景,可能对你有用作为参考。
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
文档不会经常更新,因此成本很小。
- 一个
text
文档将只与少量statements
objects/documents 关联。
在这种情况下,选择选项 1 可能是个好主意(即,将语句保存在 text
文档的数组中)。优点是您可以编写相当简单的查询并避免维护另一个 statement
.
这里是 very good document 阅读更多关于 MongoDB 架构设计的信息。