【问题标题】: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_FAVORITEMOVIE,我将添加一个带有列的新表 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 时变得很奇怪,让我们回滚所有工作之后完成)每个用户意义上。

这是你所追求的吗?

【讨论】:

  • 合并两条旧记录创建一条新记录怎么样?
猜你喜欢
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 2011-11-08
  • 2020-11-29
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多