8

考虑这种情况:汽车是从Salesperson那里购买的。销售人员在陈列室(且仅在一个陈列室)工作。陈列室隶属于制造商,仅销售该制造商制造的汽车。同时,汽车是特定型号的,而型号是由制造商制造的。

限制 R:汽车模型的制造商必须与汽车销售人员的陈列室的附属制造商是同一制造商。

该图显示了明显的外键关系。

     ---->  Manufacturer  <----
     |                        |
     |                        |
 Showroom                     |
     ^                        |
     |                      Model
     |                        ^
Salesperson                   |
     ^                        |
     |                        |
     ---------  Car  ----------

您如何执行限制 R?您可以添加外键关系Car --> Manufacturer。然而,汽车制造商可以通过围绕“钻石”以一种或另一种方式连接表格来建立,所以这样做肯定不会标准化吗?但是我不知道如何强制执行约束。

4

2 回答 2

4

确保钻石的“底部”不能参考最终导致钻石的不同“顶部”的钻石“侧面”的方法是使用识别关系和由此产生的“胖”自然键,因此它们可以在底部合并:

在此处输入图像描述

(为简洁起见,仅显示 PK 字段。您几乎可以肯定需要车辆识别号作为备用键Car等...)

ManufacturerId沿钻石两侧迁移,并最终在底部合并为一个区域。它是单一领域的事实确保不会有两个制造商导致同一辆车。

顺便说一句,这仍然不会阻止您使用代理键(除了这些自然键),假设 DBMS 支持 FK 来替代键:

在此处输入图像描述

在这个模型中,代理是多余的,但是你可能还有一些其他的实体,你没有向我们展示,这可能会从使用更纤细的 FK 中受益。


以上是您的图表的最直接转换,其中汽车仅作为已售汽车存在。但是,我怀疑您希望能够存储尚未售出的汽车,并在售出时记住购车者等...

所以,一个更完整的模型看起来像这样:

在此处输入图像描述

我们只是反复重复识别关系技巧,因此汽车不能在不同制造商的陈列室中展示,也不能由不同陈列室的销售人员出售。

当只有一排时,汽车是未售出的Car。当有一排 inCar 对应的排 in时,汽车被出售Sale。两者CarSale共享相同的 PK,这是“1 到 0..1”的关系,也可以通过合并Car和来建模Sale,并使 sale 的字段可以为 NULL,并使用适当的 CHECK 确保它们不能“部分为 NULL” .

顺便说一句,无论什么时候你卖东西,你都需要确保销售是“及时冻结的”。例如,购买者实际支付的价格不应该仅仅因为汽车在售出价格发生变化而改变。在这里查看更多信息。

于 2012-09-06T11:55:03.873 回答
3

如果我正确理解了这个问题,这应该很接近。

在此处输入图像描述

这里有一些关于钥匙的细节

--
-- Keys for SalesPerson
--
alter table SalesPerson
  add constraint PK_salesperson primary key (PersonID)

, add constraint AK1_salesperson unique (ManufacturerID, ShowRoomNo, PersonID) 

, add constraint FK1_salesperson foreign key (PersonID)
                           references Person (PersonID)

, add constraint FK2_salesperson foreign key (ManufacturerID, ShowRoomNo)
                         references ShowRoom (ManufacturerID, ShowRoomNo)
;

--
-- keys for Sale table
--
alter table Sale
  add constraint PK_sale primary key (SaleID)

, add constraint FK1_sale foreign key (BuyerID)
                    references Person (PersonID)

, add constraint FK2_sale foreign key (ManufacturerID, ModelName, ShowRoomNo)
                references CarDisplay (ManufacturerID, ModelName, ShowRoomNo)

, add constraint FK3_sale foreign key (ManufacturerID, ShowRoomNo, SalesPersonID)
               references SalesPerson (ManufacturerID, ShowRoomNo, PersonID)
;
于 2012-09-05T20:41:30.323 回答