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

Mysql 重组现有网站上的表格以存储历史数据?,mysql,database-design,normalization,database-relations,Mysql,Database Design,Normalization,Database Relations,我一直试图在现有的问题中找到与我的问题相匹配的答案,我会接受链接作为答案,如果你有,我会关闭我的问题 我试图找到的是一种重组现有表的方法。我有一个网站,我花了很长时间在上面。现在我有了所有的表格和选择。不幸的是,随着用户更新信息,“First Name”“Last Name”表正在发生很大变化。我想存储这些字段的历史数据,这样我就可以在用户更改后通过他们的真实姓名找到他们。这些名字不是唯一的,但它们比它们的ID号更容易记住。所以,我有一个带有字段的成员表(用户名、电子邮件、名字、中间名、家庭名、

我一直试图在现有的问题中找到与我的问题相匹配的答案,我会接受链接作为答案,如果你有,我会关闭我的问题


我试图找到的是一种重组现有表的方法。我有一个网站,我花了很长时间在上面。现在我有了所有的表格和选择。不幸的是,随着用户更新信息,“First Name”“Last Name”表正在发生很大变化。我想存储这些字段的历史数据,这样我就可以在用户更改后通过他们的真实姓名找到他们。这些名字不是唯一的,但它们比它们的ID号更容易记住。所以,我有一个带有字段的成员表(用户名、电子邮件、名字、中间名、家庭名、dob、密码、国家)。我是否应该为firstname和familyname创建新表,以便存储更改?

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

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

我也遇到了类似的问题。我很快就摆脱了困境 创建了一个包含此类字段的表

| Id | id_user | name_field | value | date |
我想很多事情都很清楚。。。“
name\u字段
”表示用户已更改。。。(姓名、国家等)
单元格中的“
value
”和发生更改时的“
date
”我遇到了类似的问题。我很快就摆脱了困境 创建了一个包含此类字段的表

| Id | id_user | name_field | value | date |
我想很多事情都很清楚。。。“
name\u字段
”表示用户已更改。。。(姓名、国家等)
单元格中的“
值”
”以及发生更改时的“
日期”

以确保我正确解释了您的问题: 您当前有一个包含字段的表
username、email、firstname、middlename、familyname、dob、password、country
您希望存储firstname和familyname列的历史记录。对吗

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

这种设计是自描述的,但如果您存储表中所有字段的更改,而不仅仅是名字和姓氏,则会更好。它还允许您存储密码历史记录

该表将类似于:

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
当鲍勃改变他的姓氏时,这就变成了

    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

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

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

这种设计是自描述的,但如果您存储表中所有字段的更改,而不仅仅是名字和姓氏,则会更好。它还允许您存储密码历史记录

该表将类似于:

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
当鲍勃改变他的姓氏时,这就变成了

    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

那么,你是说我应该有一个长表,其中包含
| Id | Id | name | name | value | name | u from | name | u to | Id | lastname | field | lastname | u from | lastname |直到
等等,用于电子邮件、firstname、middlename等。,等等?在我的回答中添加了一个示例是的-我假设ID是某种用户标识符,应该保留。如果列没有意义,可以增加ID使其唯一;如果你需要保留它,你可以添加一个主键。你是说我应该有一个带有
| Id | Id | u name | name | u field | name | value | name | u from | name | u直到| Id | lastname |字段| lastname |值| lastname | u从| lastname | |
等的长表吗。,等等?在我的回答中添加了一个示例是的-我假设ID是某种用户标识符,应该保留。如果列没有意义,可以增加ID使其唯一;如果您需要保留它,您可以添加主键、添加全名字段、删除lastname字段。。。但是如何处理历史数据呢?所以添加一个全名字段,删除lastname字段。。。但是,你如何处理历史数据呢?不过,我并不只是想知道发生变化的日期。我还希望能够通过以前的名字查找用户。有什么问题吗。简单地选择一个用户ID的表格,为您提供他的所有更改。那么,如何按以前的用户名进行选择呢?请从表格中选择值,其中namefield='username'和id_user=:id order by date limit 1I我不只是想要更改的日期。我还希望能够通过以前的名字查找用户。有什么问题吗。简单地选择一个用户ID的表格,为您提供他的所有更改。那个么如何按以前的用户名进行选择呢?从表中选择值,其中namefield='username'和id_user=:id order by date limit 1