语境
我有 3 个实体(用户、商店和汽车),一辆汽车一次只能有一个regNum
、一个shopId
和一个ownerId
,这就是它们嵌入汽车表的原因。
create table "user"
(
id bigint primary key,
name varchar(40) not null
);
create table "shop"
(
id bigint primary key,
name varchar(40) not null
);
create table "car"
(
id bigint primary key,
ownerId bigint,
regNum varchar(8),
shopId bigint,
price numeric(10,2),
constraint foreign key(ownerId) references "user",
constraint foreign key(shopId) references "shop"
);
问题
我想保留汽车的历史regNum
,ownerId
以及shopId
最终其他未来领域(但不一定是所有领域)。什么是最好的解决方案(可扩展性/性能/易用性)?我找到了下面的那些,也许有人遇到过同样的问题,也许还有另一种解决方案?
解决方案 1
我添加了与要“观看”的字段一样多的历史表。这似乎是一种标准化的工作方式,但它看起来维护起来也很复杂,它也更贪婪,好像我一次修改所有字段(regNum、shopId 和 ownerId),我需要插入 3 条记录(每个记录一个历史等等,如果我稍后看其他领域)。
create table "carOwner"
(
id bigint primary key,
carId bigint not null,
changedAt timestamp not null,
ownerId bigint,
constraint foreign key(carId) references "car",
constraint foreign key(ownerId) references "user"
);
create table "carShop"
(
id bigint primary key,
carId bigint not null,
changedAt timestamp not null,
shopId bigint,
constraint foreign key(carId) references "car",
constraint foreign key(shopId) references "shop"
);
create table "carRegNum"
(
id bigint primary key,
carId bigint not null,
changedAt timestamp not null,
regNum varchar(8),
constraint foreign key(carId) references "car"
);
方案二
我将历史记录保存在一个表中,它是car
表在给定时间的简单快照。它似乎更容易维护,但它并不精确,因为如果我没有以前的记录,我无法直接看到发生了什么变化。
create table "carHistory"
(
id bigint primary key,
carId bigint not null,
changedAt timestamp not null,
ownerId bigint,
regNum varchar(8),
shopId bigint,
constraint foreign key(carId) references "car",
constraint foreign key(shopId) references "shop",
constraint foreign key(ownerId) references "user"
);