使用 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 - 混合解决方案 对于每个用户,当更新名称时,将使用更新信息将条目添加到队列中(用户更新和队列中的插入将在一次刷新中进行),并有一个任务在后台进行实际更新。
第一个解决方案似乎是最容易实现的,但我认为它可能非常消耗资源。第二种解决方案会使更新请求长得离谱,即使读/写比率很高,这可能是个问题。我认为第三种解决方案是要走的路,我这样想对吗?
我也想以 DRY 的方式来做,例如,我不想在 preUpdate 回调中为每个数据非规范化的 Document 重写相同的代码。我正在考虑制作自定义注释,这是个好主意吗?