如果这不是要询问的正确 SE 站点,我们深表歉意。
我正在设计目录管理应用程序。层次结构中的任何元素都必须进行版本控制,即当我更改它的属性时,将创建一个新版本。新版本也可以有与以前不同的孩子。用户在管理目录时可以在版本之间切换,因此我需要列出子项的所有现有版本。切换版本时,将更新所有后代)。
我的第一个想法是
| A | | B | | C |
|--------------| |--------------| |--------------|
| ID (k) | | ID (k) | | ID (k) |
| VER (k) | | VER (k) | | VER (k) |
| ... | | A_ID (fk) | | B_ID (fk) |
| | | A_VER (fk) | | B_VER (fk) |
|--------------| | ... | | ... |
|--------------| |--------------|
实体的键总是类似于 (ID, VER) 而父级的 fk 是 (P_ID, P_VER)。
这是实施它的好方法吗?
更新:显然比这更复杂。版本控制的意思是元素有有效期,我们需要保留旧版本。例如,客户购买价格为 x 的产品。1 月 1 日之后,它将花费 y。1 月 1 日之后的新客户获得新价格 y,但老客户继续支付 x。
添加时间戳列可能是这里的最佳选择。
老实说,您的要求听起来像是噩梦和版本控制系统之间的交叉。我强烈建议查看像Git这样的流行解决方案,而不是使用关系数据库重新实现DVCS 。您的应用程序可以有效地成为 Git 的漂亮皮肤。 如果您必须通过关系数据库执行此操作,那么我认为按时间戳进行版本控制将是您成功的最佳机会。
基本策略是在每个实体上放置时间戳。然后,当您需要转到最新版本时,您可以通过具有最新时间戳的关系链选择所有实体。当您需要获取特定版本时,您可以获取处于或早于所需版本时间戳的实体的所有最新版本。
按时间戳进行版本控制可防止您将所有旧实体复制到新版本 ID,即使这些实体没有更改也是如此。它还可以让您避免跟踪那些版本 ID 的疯狂行为。
这可能会导致查询时间变慢,但您可以尝试一下,看看它是否适合您的需要。重申一下,我不认为关系数据库是最好的解决方案,但有时生活会迫使我们将方钉放在圆孔中。如果那是你一生中的命运,我祝你一切顺利。
编辑:版本控制与历史定价有关
我同意时间戳是可行的方法,因为版本控制与历史定价有关。要处理这个问题,您只需要一个有效开始日期列。要查找任何时间点的汇率,您只需找到不在未来的最近日期。例如:
只需确保为每个产品设置唯一的开始日期,否则该代码将返回比您想要的更多的结果。老实说,这听起来比每次更新都必须还原整个数据库要简单得多。:)