我想为几张桌子设计一个更改日志。让我们称之为表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还是另一个?还有其他重要的实际想法我不知道吗?
答案 0 :(得分:1)
这种方法很大程度上取决于您的需求。你为什么想要历史表?
如果它仅用于审计目的,则创建一个单独的restaurant_history
表(想法2)以保留历史记录。如果您想在应用程序中显示历史记录,请使用以下选项之一转到signle restaurants
表:
seq_no
- 记录每次更新时递增的版本号。如果您需要当前数据,则必须搜索给定seq_no
的最高restaurant_id(s)
,因此也可以使用current
标记,允许直截了当current = true
valid_from
,valid_to
- 其中valid_to
为当前记录为空有时需要有效地查询哪些属性确切改变了。要轻松完成此操作,您可以考虑属性级别的历史记录表:(restaurant_id, attribute, old_value, new_value, change_date, user)
。