TL; DR:这个设计是否正确,我应该如何查询?
我们假设我们有city和地址的历史记录表,其设计如下:
CREATE TABLE city_history (
id BIGINT UNSIGNED NOT NULL PRIMARY KEY,
name VARCHAR(128) NOT NULL,
history_at DATETIME NOT NULL,
obj_id INT UNSIGNED NOT NULL
);
CREATE TABLE address_history (
id BIGINT UNSIGNED NOT NULL PRIMARY KEY,
city_id INT NULL,
building_no VARCHAR(10) NULL,
history_at DATETIME NOT NULL,
obj_id INT UNSIGNED NOT NULL
);
原始表几乎相同,除了history_id和obj_id(city:id,name; address:id,city_id,building_no )。 city和地址(city_id)之间也存在外键关系。
历史记录表会在原始条目(创建,更新,删除)的每次更改时填充,并在给定时间显示条目的确切状态。
obj_id保存原始对象的id - 没有外键,因为原始条目可以删除,历史记录条目也不能。 history_at是创建历史记录条目的时间。
为每个表单独创建历史记录条目 - 更改城市名称会创建city_history条目,但不会创建address_history条目。