让我们考虑一下我们有一个很大的应用程序,其中包含一个带联系人的地址簿。该应用程序的很大一部分保存了对这些联系人的引用。
现在地址簿包含大量重复的联系人(其中Contact A
和Contact B
具有相同的name
和address
,但电话号码不同,或者有一个在名称中键入错误等。)
在应用程序中使用了Contact A
和Contact B
,尽管在DB中保存了对它们的引用。这就是为什么我们不能简单地删除其中一个并扔掉它的ID。
当用户现在搜索联系人时,他无法确定哪一个是正确的选择。
处理此问题的最佳/最简单/最快的解决方案是什么?
基本且干净的解决方案:合并数据:Contact A -> Contact B
。然后更新整个数据库,并将Contact A ID
替换为Contact B ID
。之后Contact A
可以安全删除。 但这种方式可能需要花费很多时间,而且你必须编写大量代码。
两个查询解决方案:合并数据。将字段replaces
添加到Contact B
,其中包含Contact A
的ID。然后删除Contact A
。当有联系人引用时,它执行的查询将首先查找_id = ...
,然后查看replaces = ...
。如果第二个查询成功,那么我们应该使用正确的ID更新引用。 但这样我们需要创建一个额外的索引。
两个查询解决方案反向:这类似于 2。:合并数据。将字段replacedBy
添加到Contact A
。当查询返回包含replacedBy
字段的联系人时,我们必须执行另一个查询以获取正确的联系人,然后替换该引用。 但这样我们永远不会删除Contact A
,因为我们无法确定所有这些引用何时更新。
只需隐藏旧/错误条目:合并数据。并向旧/错联系人添加一些deleted = true
字段。这样它就不会出现在地址簿中。 但引用仍然会显示旧/错误的数据。
理想情况下,_id
使用ObjectId
s,但数组,据我所知,MongoDB不支持这种数组。
请分享您的想法,优点和缺点。
也许你有另一个解决方案,那就是更好/更快/更有效/更优雅的事件。