保留用户更改的旧数据

时间:2009-10-12 03:07:26

标签: php change-tracking

我有一个users表,其中包含以下字段:userid, phone, and address。由于这是用户数据,我让用户随时更改它们。问题是我想跟踪这些变化并保留旧数据。以下是我考虑过的一些想法:

  • 将新数据附加到旧数据并使用管道之类的分隔符。检索字段时,我会检查是否存在该分隔符,如果存在,则将其后的字符作为新数据。 (感觉很麻烦,感觉不对劲)

  • 使用以下字段设置不同的changes表:userid, fieldname, fieldcontent。当/如果用户更改数据(任何数据)时,我会将该事件记录在用户的userid下的这个单独的表中,以及该字段的名称/ id和该字段的旧内容,然后我现在可以覆盖他的旧数据在users中使用新的。如果我想查找此用户所做的所有更改,我将通过其用户ID搜索changes表。问题在于我将(所有字段的)所有数据更改混合到一个表中,因此fieldcontent中的changes字段必须是文本以适应不同的字段类型。这似乎仍然比第一个想法更好,但仍然不确定我是否做对了。

有哪些其他想法或已知的最佳做法来保留旧数据?

提前致谢

3 个答案:

答案 0 :(得分:3)

无论你做什么都不做第一个。

更改表是更好的方法。它也称为审计或历史表。但是我不会做关键值对的历史。而是根据相关表格执行历史记录。您可以在应用程序代码或数据库触发器中执行此操作。基本上,无论何时发生插入,更新或删除,您都会记录发生的事件和更改的数据。

表用户:

  • ID
  • 用户名
  • 电子邮件地址
  • 电话
  • 地址

表user_history:

  • ID
  • change_type(I,U或D表示插入,更新或删除)
  • user_id(FK user.id)
  • 电子邮件地址
  • 电话
  • 地址
  • 更改日期/时间
  • 可选地,还存储更改记录的人

答案 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开始并从那里开始递增。 changedatechangeaddr可用于跟踪时间和地点。

如果字段值未更改,请随意在相应的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.