【问题标题】:Is there a design pattern for merging duplicate database records?是否有合并重复数据库记录的设计模式?
【发布时间】:2011-11-02 18:37:26
【问题描述】:
例如,假设我有一个面向影迷的社交网站。有些人将“洛基”列为他们最喜欢的电影,有些人将“洛基1”列为“洛基1”,其他人仍将“洛基I”列为。显而易见的是将三者合并在一起并更新关联的表。然而,对于每一个明显的解决方案,都有一个设计模式 1)更复杂,2)有一些额外的好处。是否有合并重复数据库记录的设计模式?具体来说,提供可审计性或可逆性的东西?
【问题讨论】:
标签:
design-patterns
database-design
【解决方案1】:
只要你说“可逆性”,我就会想到Command Pattern。
典型的例子是支持 Undo 风格的行为,但我认为这也非常适合可审计性 - 特别是因为单个“步骤”(因为需要更好的词)非常小且易于表示(例如 @ 987654322@)。
如何让命令模式真正为您的场景工作?
好吧,在 RDBMS 领域而不是 OO 建模中保留这一点,假设您已经有了表 USER_FAVORITE 和 MOVIE,我将添加一个带有列的新表 USER_FAVORITE_MOVIE_MERGE_COMMAND:
id
date
user_id
old_favorite_movie_title
new_favorite_movie_title
因此,您的夜间清理脚本(或其他任何内容)会在 USER_FAVORITE 表上运行,以查找非标准电影标题。每次找到一个,它就会更正它并将相关事实记录在USER_FAVORITE_MOVIE_MERGE_COMMAND 表中。
您的审计线索就在那里,如果您需要反转清理工作,请按时间倒序“回放”这些行,将 new 替换为 old。
请注意您是如何在 时间 意义上同时获得可逆性和可审计性的(例如,昨晚的批处理运行在凌晨 2.12 时变得很奇怪,让我们回滚所有工作之后完成)和在每个用户意义上。
这是你所追求的吗?