Учитывая ваше бизнес-правило о том, что каждый автомобиль принадлежит как минимум одному владельцу (то есть владельцы существуют до того, как они назначены автомобилю), и ваше рабочее ограничение, что таблица может увеличиваться в размере, я разработал бы схему следующим образом:
(общий синтаксис 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 )
)
Лично я бы не трогал третью таблицу из моего клиентского приложения, а просто позволил бы базе данных выполнить работу и сохранить целостность данных - с помощью триггеров ON UPDATE
И ON DELETE
на таблице Cars для заполнения таблицы 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, Винс