在旧的网络应用程序中,我有一个具有以下结构的表:
tools(id, name, abbreviation, width, height, power, type)
问题是我需要为工具添加历史支持。工作场景是每个工具的细节都可以修改,我需要跟踪变化。例如,如果我需要从过去的某个日期看到工具的详细信息,我该怎么做?
数据库的外观如何?
答案 0 :(得分:1)
可能有很多方法可以做到这一点。我过去成功的一种方法是在表格中添加version_id
列。因此,id
和version_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)
);