可以多次使用外键吗?

时间:2017-03-27 15:04:45

标签: mysql database-design

为新手问题道歉。

表格的主键,例如Holiday,就像Holiday_ID一样。假期根据您购买的机票,参考您可以购买的一张假期票。

假设我在具有Customer_ID的复合实体中使用了Holiday_ID来识别与客户关联的Holiday实例,无论出于何种目的。

但是,假设我还想跟踪与此实例相关的其他信息:客户为机票支付了多少费用,客户尚未为机票支付多少费用

我有两个选择:

a)我可以创建另一个复合实体。但是,我不确定我是否可以这样做,因为我不确定你是否可以多次使用一个特殊的外键

b)我可以创建复合/关联实体,但是,我不确定您是否可以创建具有两个以上外键的复合实体?

1 个答案:

答案 0 :(得分:0)

要回答问题的技术部分,一旦创建了复合唯一键或主键,表中只有一条记录可以在该键中定义的字段集中具有相同的值。所以,不,你不能重复使用holidayId键与相同的客户。如果您愿意,可以与其他不同的客户一起使用 其次,可以包含在唯一键或主键中的属性数量没有限制。如果您需要,并且如果它合适且符合规范化规则,则密钥可以包括表的所有属性。

第三,要回答下面的问题,表中的任何列或列集都可以定义为外键,只要它也是数据库中某个表的主键或唯一键即可。并且表中可以定义任意数量的FK,它们甚至可以重叠。 (您可以将HolidayId作为FK,并且HolidayIDCustomerId作为复合FK)唯一的限制是FK必须引用某些表的主键或唯一键数据库。(它也可以是FK所在的同一个表,就像向supervisorId表中添加employee一样,它是同一个EMployeeId的FK employee表)

此示例说明了在不使用自然键的情况下使用代理键的问题之一。那么,什么,确实是一个"假日"? 2016年圣诞节是否相同"假日" 2015年圣诞节?阿鲁巴的圣诞节和夏威夷的圣诞节一样吗?

然后,关于用于识别客户与Holiday的关联的复合表,如果客户在明年圣诞节前往Aruba,或者是另一个实例,它是否是相同的关联?如果客户想要5张票,表中的行代表什么?

在数据库设计中应该做的第一件事是逻辑设计,它在业务术语中尽可能清楚明确地定义数据库中每个表的实体的含义。