表的更改日志

时间:2014-02-07 11:57:18

标签: sql sql-server database-design entity-relationship

我想为几张桌子设计一个更改日志。让我们称之为表restaurant。每次用户修改餐馆列表时,都应记录更改。

创意1

我的第一个想法是创建2个表。其中一个包含所有餐馆RESTAURANT_VALUE (restaurantId*, restaurantValueId*, address, phone, ..., username, insertDate)。每次进行更改时,都会创建一个新条目。然后是一个表RESTAURANT (restaurantId*, restaurantValueId),它将链接到当前有效 restaurantValueId。因此,一个表保存当前版本和先前版本。

创意2

它也以2个表开头。其中一个包含所有现有的餐馆。例如RESTAURANT_CURRENT。第二个表格包含所有更改RESTAURANT_HISTORY。因此两者都需要具有完全相同的列。每次发生更改时,“当前”表的值都会复制到历史记录表中,新版本会复制到“当前”中。

我的意见

创意1并不关心是否会添加列,因此维护和添加列很容易。但是,我认为随着数据库的增长......它不会放慢速度吗? Idea 2的优势在于具有值的表格永远不会有任何“旧”的东西而且不会变得拥挤。

从理论上讲,我认为Idea 1应该是完成的

你怎么看?你会选择Idea 1还是另一个?还有其他重要的实际想法我不知道吗?

1 个答案:

答案 0 :(得分:1)

这种方法很大程度上取决于您的需求。你为什么想要历史表?

如果它仅用于审计目的,则创建一个单独的restaurant_history表(想法2)以保留历史记录。如果您想在应用程序中显示历史记录,请使用以下选项之一转到signle restaurants表:

  • seq_no - 记录每次更新时递增的版本号。如果您需要当前数据,则必须搜索给定seq_no的最高restaurant_id(s),因此也可以使用current标记,允许直截了当current = true
  • valid_fromvalid_to - 其中valid_to为当前记录为空

有时需要有效地查询哪些属性确切改变了。要轻松完成此操作,您可以考虑属性级别的历史记录表:(restaurant_id, attribute, old_value, new_value, change_date, user)