鉴于你的业务规则,每辆车属于至少一个所有者(即。存在业主,他们被分配到前车AA)和您的运营约束,该表可能变大,如下我设计的架构:
(一般SQL 92语法:)
CREATE TABLE Cars
(
CarID integer not null default autoincrement,
OwnerID integer not null,
CarDescription varchar(100) not null,
CreatedOn timestamp not null default current timestamp,
Primary key (CarID),
FOREIGN KEY (OwnerID) REFERENCES Owners(OwnerID)
)
CREATE TABLE Owners
(
OwnerID integer not null default autoincrement,
OwnerName varchar(100) not null,
Primary key(OwnerID)
)
CREATE TABLE HistoricalCarOwners
(
CarID integer not null,
OwnerID integer not null,
OwnedFrom timestamp null,
Owneduntil timestamp null,
primary key (cardid, ownerid),
FOREIGN KEY (OwnerID) REFERENCES Owners(OwnerID),
FOREIGN KEY (CarID) REFERENCES Cars(CarID)
)
我个人不会碰到我的客户端应用程序中的第三张表格,但只需让数据库完成工作并保持数据完整性 - 每当汽车改变所有者时(即,只要UPDATE是UPDATE,汽车表格上的ON UPDATE
和ON DELETE
触发器就会填充HistoricalCarOwners
表格在OwnerId列上承诺)或汽车被删除。
通过上述模式,选择目前的车主是微不足道的,选择历史车主是一个简单的
select ownerid, ownername from owners o inner join historicalcarowners hco
on hco.ownerid = o.ownerid
where hco.carid = :arg_id and
:arg_timestamp between ownedfrom and owneduntil
order by ...
HTH,文斯
这个问题是它需要一个(可能是昂贵的)插入查找。我宁愿不使用“end_date”字段出于这个原因(也是多余的)。 – 2009-04-13 20:45:58