鑑於你的業務規則,每輛車屬於至少一個所有者(即。存在業主,他們被分配到前車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