2

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

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

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

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

提前致谢

4

3 回答 3

3

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

更改表是一种更好的方法。它也称为审计或历史表。但是,我不会记录键值对的历史。而是为每个相关表做一个历史记录。您可以在应用程序代码中或通过数据库触发器执行此操作。基本上,每当发生插入、更新或删除时,您都会记录发生了什么以及更改了哪些数据。

表用户:

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

表 user_history:

  • ID
  • change_type(I、U 或 D 用于插入、更新或删除)
  • user_id (FK user.id)
  • 电子邮件地址
  • 电话
  • 地址
  • 更改日期/时间
  • 可选地,还存储谁更改了记录
于 2009-10-12T03:14:04.413 回答
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用于跟踪时间和地点。

如果字段值未更改,请随意将 NULL 放在相应的users_history表字段中。

归根结底,您的应用程序不需要更改或在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
于 2009-10-12T03:15:08.393 回答
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.
于 2009-10-12T04:37:02.550 回答