首页 > 解决方案 > 具有关系的记录的版本控制概念(外键)[数据库]

问题描述

对于每个表都有一个额外的历史/修订表的版本控制概念,您想在其中跟踪更改,我想知道如何处理关系(外键)?

例子:

Table: T_Shelf
ID, Name

Table: T_Inventory
ID, Item, FK_T_Shelf_ID

Table: T_Shelf_Rev
ID, ID_T_Shelf, Name, Date_Modified

Table: T_Inventory_Rev
ID, ID_T_Inventory, Item, (FK_T_Shelf_ID or FK_T_Shelf_Rev_ID), Date_Modified

我是否将外键链接到相应的历史表?还是该方法根本不适用于关系数据库?

标签: sqldatabase-designdatabase-versioningtemporal-tables

解决方案


像这样建模它们:

CREATE TABLE t_shelf (
  shf_surrogate_id INTEGER NOT NULL 
    DEFAULT HASH(shf_business_id,shf_valid_from) NOT NULL PRIMARY KEY 
, shf_business_id  INTEGER NOT NULL
, shf_valid_from  DATE     NOT NULL
, shf_valid_to    DATE     NOT NULL
, shf_name        VARCHAR(32)
)

CREATE TABLE inventory (
  inv_surrogate_id INTEGER NOT NULL 
    DEFAULT HASH(inv_business_id,inv_valid_from) NOT NULL PRIMARY KEY 
, shf_surrogate_id INTEGER NOT NULL FOREIGN KEY REFERENCES t_shelf
, inv_business_id  INTEGER NOT NULL
, inv_valid_from   DATE    NOT NULL
, inv_valid_to     DATE    NOT NULL
, inv_item         VARCHAR(32)
);

不要按照您的建议将词干和版本分开。当前活动记录的valid_to日期值为9999-12-31。如果您需要有关如何处理此类模型的详细信息 - 只需在此处回答。

一些数据库提供了一个HASH()函数,该函数基于一个或多个输入表达式返回一个整数,逗号分隔。我在这里使用它。否则,您将不得不使用数据库序列对象。


推荐阅读