我有一个users
表,其中包含以下字段:userid, phone, and address
。由于这是用户数据,我让用户随时更改它们。问题是我想跟踪这些变化并保留旧数据。以下是我考虑过的一些想法:
将新数据附加到旧数据并使用管道之类的分隔符。检索字段时,我会检查是否存在该分隔符,如果存在,则将其后的字符作为新数据。 (感觉很麻烦,感觉不对劲)
使用以下字段设置不同的changes
表:userid, fieldname, fieldcontent
。当/如果用户更改数据(任何数据)时,我会将该事件记录在用户的userid下的这个单独的表中,以及该字段的名称/ id和该字段的旧内容,然后我现在可以覆盖他的旧数据在users
中使用新的。如果我想查找此用户所做的所有更改,我将通过其用户ID搜索changes
表。问题在于我将(所有字段的)所有数据更改混合到一个表中,因此fieldcontent
中的changes
字段必须是文本以适应不同的字段类型。这似乎仍然比第一个想法更好,但仍然不确定我是否做对了。
有哪些其他想法或已知的最佳做法来保留旧数据?
提前致谢
答案 0 :(得分:3)
无论你做什么都不做第一个。
更改表是更好的方法。它也称为审计或历史表。但是我不会做关键值对的历史。而是根据相关表格执行历史记录。您可以在应用程序代码或数据库触发器中执行此操作。基本上,无论何时发生插入,更新或删除,您都会记录发生的事件和更改的数据。
表用户:
表user_history:
答案 1 :(得分:1)
我们用来跟踪此类更改的一种非常简单的方法是:
users_history`
userid
changenumber smallint not null
changedate datetime not null
changeaddr varchar(32) not null
phone NULL,
address NULL
primary key on (userid, linenumber)
每次在users
表中插入或更新记录时,只需在users_history表中插入新记录即可。 changenumber
从1开始并从那里开始递增。 changedate
和changeaddr
可用于跟踪时间和地点。
如果字段值未更改,请随意在相应的users_history
表字段中添加NULL。
在一天结束时,您的应用无需在users
表中更改或存储庞大的历史数据,但只要触手可及,您就拥有了所有数据。
修改强>
这确实保留了旧数据。请参阅以下示例,其中用户使用给定的地址和电话开始,然后4天后更新了地址,并在5天后更新了电话。 你拥有一切。
当前用户记录:
100 | 234-567-8901 | 123 Sesame Street
示例历史记录表
100 | 1 | 2009-10-01 12:00 | 123-456-7890 | 555 Johnson Street
100 | 2 | 2009-10-05 13:00 | NULL | 123 Sesame Street
100 | 3 | 2009-10-10 15:00 | 234-567-8901 | NULL
答案 2 :(得分:0)
实现这一目标的最简单方法是创建另一个仅用于历史目的的表,即快照。您不需要镜像所有字段,只需
change_id // row id (just for easy management later on if you need to delete specific row, otherwise its not really necessary)
user_id // Original user id
change_time // time of change
data // serialized data before change.