使用 MongoDB 时,引用数据的非规范化似乎是一种非常常见的做法。然而,我没有看到任何内置方法可以使用 Doctrine MongoDB ODM 来处理这个问题。
假设我有一个社交网络,用户可以在其中互相关注,这里有两个示例用户:
{
_id : id1,
name: "Malcolm Reynolds",
followed: []
}
{
_id : id2,
name: "Zoe Alleyne",
followed: [
{ _id: id1, name: "Malcolm Reynolds" }
]
}
如您所见,我希望“名称”属性被非规范化。正如我所说,Doctrine ODM 中似乎没有内置方法可以做到这一点。 由于该主题的最新一期已经是一年了,所以我会尝试自己做。
虽然我在互联网上发现了大量文章解释非规范化在什么情况下有用,并提到保持非规范化数据一致如何是一件痛苦的事情,但我没有找到一篇解释如何实现非规范化数据更新过程的文章。
在我的情况下,最终一致的数据就足够了,用户名的更新和非规范化数据的更新之间可能有几个小时。我可以看到 3 种不同的方法来做到这一点:
1 - 一致性检查器: 在后台运行一个定期更新非规范化数据的任务。
2 - 更新触发器: 名称字段的每次更新都会在一次刷新中更新所有关联的非规范化数据。
3 - 混合解决方案 对于每个用户,当名称更新时,一个条目将被添加到带有更新信息的队列中(用户更新和插入队列将在一次刷新中完成),并在后台运行一个任务来执行以下操作:实际更新。
第一个解决方案似乎是最容易实现的,但据我所知,它可能非常消耗资源。第二种解决方案将使更新请求变得非常长,即使读/写比率很高,这也可能是一个问题。我认为第三种解决方案是可行的方法,我的想法正确吗?
我也想以干的方式来做,例如我不想在 preUpdate 回调中为每个数据非规范化的文档重写相同的代码。我正在考虑制作自定义注释,这是个好主意吗?
是的,您对在 Doctrine MongoDB ODM 中同步非规范化数据的混合解决方案的倾向是合理的。它在性能和一致性之间取得了平衡,使其成为可扩展的选择。使用自定义注释来保持实现干燥是一种很好的方法,因为它允许可重用和可维护的代码。该方法涉及标记需要与注释同步的字段,通过后台任务队列处理更新,并异步处理这些任务以高效更新非规范化数据。