重组现有网站上的表格,以存储历史数据?

时间:2011-08-16 08:37:51

标签: mysql database-design normalization database-relations

我一直在尝试在现有问题中找到与我的问题匹配的内容,我会接受链接作为答案,如果你拥有它们,请关闭我的问题。

我想要找到的是重构现有表格的方法。我有一个网站,我花了很长时间研究它。现在我有所有表格并选择到位。不幸的是,随着用户更新他们的信息,“名字”“姓氏”表正在发生很大变化。我想存储这些字段的历史数据,因此我可以在用户更改后找到真实姓名。名称不是唯一的,但它们比ID号更容易记住。所以,我有一个成员的表与字段(用户名,电子邮件,名字,中间名,姓氏,dob,密码,国家)。我应该只为firstname和familyname创建新表,以便我可以存储更改吗?

3 个答案:

答案 0 :(得分:2)

我有类似的问题。我摆脱了这种情况 用这种字段创建了一个表。

| Id | id_user | name_field | value | date |

我认为很清楚...“name_field”是用户已经改变了...(姓名,国家等) 单元格中的“value”和发生变化时的“date

答案 1 :(得分:1)

我建议答案是肯定的。添加第一个/姓氏的新字段,找到一个合适的算法,将“fullname”转换为“first”和“last”(有很多,你甚至可以使用excel

答案 2 :(得分:1)

只是为了确保我正确地解释了你的问题: 您目前有一个包含字段的表  username, email, firstname, middlename, familyname, dob, password, country 并且您希望存储firstname和familyname列的历史记录。这是对的吗?

如果是这样,我建议在表中添加时间有效性列(valid_from,valid_until),并为每次更改插入新行,将当前记录的“valid_from”设置为now(),将valid_until设置为null。您还将此用户的最后一行的valid_until列设置为now()。 当前记录是valid_until为null的记录。

这种设计是自我描述的,但如果您为表中的所有字段存储更改会更好 - 不仅仅是第一个和系列名称。它还允许您存储密码历史记录。

表格如下:

id
username
email
firstname
middlename
familyname
dob
password
country
valid_from
valid_until

例如:

    id    username    email    firstname    familyname    ...    valid_from    valid_until
-----------------------------------------------------------------------------------------------------
   1      bob        bob@b.com Bob          Smith                1/Jan/2011    null

当Bob改变他的姓氏时,这就变成了

    id    username    email    firstname    familyname    ...    valid_from    valid_until
-----------------------------------------------------------------------------------------------------
   1      bob        bob@b.com Bob          Smith                1/Jan/2011    1/Aug/2011
   1      bob        bob@b.com Bob          Brown                1/Aug/2011    null