重新设计我的数据库

时间:2011-10-10 19:16:55

标签: mysql database-design versioning

在旧的网络应用程序中,我有一个具有以下结构的表:
tools(id, name, abbreviation, width, height, power, type)

问题是我需要为工具添加历史支持。工作场景是每个工具的细节都可以修改,我需要跟踪变化。例如,如果我需要从过去的某个日期看到工具的详细信息,我该怎么做?

数据库的外观如何?

3 个答案:

答案 0 :(得分:1)

可能有很多方法可以做到这一点。我过去成功的一种方法是在表格中添加version_id列。因此,idversion_id的组合成为任何特定版本工具的完整密钥。请注意,使用此方法可以轻松获取特定工具的所有版本,只需选择id即可。获取当前版本的工具也很简单,只需id, max(version_id)

这种方法的缺点是你需要编写代码来管理版本控制。

答案 1 :(得分:1)

创建一个包含所有相同列的ToolsVersions表,同时仅添加时间戳。每次更改工具时,都会使用当前时间戳将旧值保存到ToolsVersions表中。然后,您可以非常轻松地查询特定范围之间的所有版本,或查找最接近所需日期的版本。

答案 2 :(得分:1)

我会保留相同的表,但添加dateEffective字段,然后每次工具更改时创建一个新行。然后在查询表时,您可以使用以下命令获取给定日期的工具版本:

SELECT * FROM tools WHERE id=@id AND dateEffective<@thisDate ORDER BY dateEffective DESC LIMIT (0,1)

编辑您可能希望创建另一个名为toolVersionId的字段作为主键。

编辑2 在回复您的评论时,如何:

SELECT *
FROM tools t1
WHERE toolVersionId IN (SELECT toolVersionId
                        FROM tools t2
                        WHERE t2.id = t1.id
                        ORDER BY t2.dateEffective DESC
                        LIMIT (0,1)
                       );