sql - 具有关系的记录的版本控制概念(外键)[数据库]
问题描述
对于每个表都有一个额外的历史/修订表的版本控制概念,您想在其中跟踪更改,我想知道如何处理关系(外键)?
例子:
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
我是否将外键链接到相应的历史表?还是该方法根本不适用于关系数据库?
解决方案
像这样建模它们:
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()
函数,该函数基于一个或多个输入表达式返回一个整数,逗号分隔。我在这里使用它。否则,您将不得不使用数据库序列对象。
推荐阅读
- c# - 从 Exchange WebService 获取电子邮件语言
- dashboard - Apache Superset 是否支持或具有类似 Tableau 中的操作筛选器功能?
- javascript - Aria 和 a11y 技术不适用于 Angular
- hadoop - HortonWorks 或 Cloudera 认证
- c# - 如何在gridview中显示当前记录的用户数据
- javascript - 如何使用 nano 库在 CouchDB 中使用过滤器复制数据
- laravel - 我怎样才能返回一个雄辩的关系,但只选择不为空的列?
- python - AttributeError: 模块 'fuzzywuzzy' 没有属性 'ratio'
- bash - VScode 终端似乎没有在 Windows 上加载 .bashrc 或 .bash_profile
- scala - 如何在Scala中检查Option是否为None