gpt4 book ai didi

mongodb:这是我应该规范化我的嵌入式对象的地方吗?

转载 作者:可可西里 更新时间:2023-11-01 10:34:52 25 4
gpt4 key购买 nike

我有一个包含 EmbeddedThingParent 集合,每个 EmbeddedThing 都包含对 User

UserCollection: [
{
_id: ObjectId(…),
name: '…'
},

]

ParentCollection: [
{
_id: ObjectId(…),
EmbeddedThings: [
{
_id: 1,
userId: ObjectId(…)
},
{
_id: 2,
userId: ObjectId(…)
}
]
},

]

我很快意识到我需要获取给定用户的所有 EmbeddedThing,我设法使用 map/reduce 完成了这一点:

"results": [
{
"_id": 1,
"value": [ `EmbeddedThing`, `EmbeddedThing`, … ]
},
{
"_id": 2,
"value": [ `EmbeddedThing`, `EmbeddedThing`, … ]
},

]

这是我真的应该将 EmbeddedThing 规范化到它自己的集合中的地方,还是我仍然应该保留 map/reduce 来完成这个?也许是其他设计?

如果有帮助的话,这是为了让用户看到他们在所有 Parent 中的 EmbeddedThing 列表,而不是为了一些报告/聚合任务(这让我意识到我可能做错了)。

谢谢!

最佳答案

“嵌入还是不嵌入:这是个问题”:)

我的规则是:

  • embed 如果嵌入对象仅在父对象的上下文中有意义。例如,没有 OrderOrderItem 没有意义。
  • 根据性能要求嵌入。阅读完整的文档树非常便宜(而不是必须进行多次查询并以编程方式加入它们)。

您应该查看您的访问模式。如果您每秒加载 ParentThing 几千次,并且每周加载一次 User,那么 map-reduce 可能是一个不错的选择。用户查询会很慢,但对于您的应用程序来说可能没问题。

另一种方法是进一步非规范化。也就是说,当您添加嵌入式事物时,将其同时添加到父事物和用户。

  • 优点:查询速度很快。
  • 缺点:代码复杂。双倍的写入量。可能失去同步(您在一个地方更新/删除,但忘记在另一个地方做)。

关于mongodb:这是我应该规范化我的嵌入式对象的地方吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9543602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com