【发布时间】:2016-02-15 03:32:20
【问题描述】:
(我有点脑子放屁,我不记得这个问题类的名称了,因为我之前在 SO 上看到过解决方案,所以请将此标记为另一个的副本问题,如果您从以前在这里找到更好的答案)。
假设我们有一个 Cars 和 CarOwners 数据库。每个 CarOwner 都有很多汽车(一对多),但每个 CarOwner 也有自己喜欢的汽车。
这是一个初始架构:
CREATE TABLE Owners (
OwnerId bigint IDENTITY(1,1) PRIMARY KEY,
Name nvarchar(100)
)
CREATE TABLE Cars (
CarId bigint IDENTITY(1,1) PRIMARY KEY,
Vin varchar(17),
OwnerId bigint,
FOREIGN KEY (OwnerId) REFERENCES Owners(OwnerId)
)
为了让车主拥有一辆最喜欢的汽车,Owners 表需要扩展一个新列 FaveCarId bigint,其中 Cars 表具有外键约束,但会在 Owners 和 Cars 之间增加不必要的耦合(例如,如果我们将Houses 或Computers 添加到数据库中,当我们获得有关所有者的信息时,我们并不关心他们的FaveCar 是什么。这也增加了一个鸡与蛋的问题,其中@ 987654328@ 列必须为NULLable 才能创建Owner 行,添加新的Car 行,然后将新的CarID 添加回FaveCar 列。
...所以另一种解决方案是扩展Cars 列以添加布尔值IsFavourite 列,但这有一个问题是没有什么能阻止某人提供两个Cars(属于同一个@ 987654337@) 一组IsFavourite 列值。唯一约束(在OwnerId+IsFavourite 之间也无济于事,因为如果所有者拥有 3 辆或更多汽车,其中 2 辆将拥有IsFavourite=0。
【问题讨论】:
-
我更新了答案以包含数据库继承架构。
标签: database-design foreign-keys