今天的法庭预订
- 表格中的每一行代表一个网球俱乐部的法庭预订,该俱乐部有一个硬地球场(法院1)和一个草地球场(球场2)
- 预订由其法院和法院保留的期限确定
- 此外,每个预订都有与之关联的费率类型。有四种不同的费率类型:
- SAVER,会员提出的法院1预订
- 标准,非成员提出的法院1预订
- PREMIUM-A,由会员提出的法院2预订
- PREMIUM-B,由非会员提出的法院2预订
表的超级键是:
- S1 = {Court,Start Time}
- S2 = {Court,End Time}
- S3 = {费率类型,开始时间}
- S4 = {费率类型,结束时间}
- S5 = {Court,Start Time,End Time}
- S6 = {费率类型,开始时间,结束时间}
- S7 = {Court,Rate Type,Start Time}
- S8 = {Court,Rate Type,End Time}
- ST = {Court,Rate Type,Start Time,End Time},琐碎的超级钥匙
请注意,即使在上表中开始时间和结束时间 属性没有重复的值,我们仍然必须 承认,在其他几天,两个不同的预订在球场1和 法院2可以同时开始或同时结束。这是 {Start Time}和{End Time}之所以不能被认为是 桌子的超级钥匙。
S1 = {Court,Start Time}是一个超级钥匙?
在第1天说,会员从11:00到12:00预订法庭1,在第2天,非会员从11:00到12:00为法庭1预订。
表中的记录是 {1,11:00,12:00,SAVER}和{1,11:00,12:00,STANDARD}
显然S1 = {Court,Start Time},不是超级密钥。或者我错了吗?
答案 0 :(得分:2)
这个例子是一个糟糕的选择因为理解表应该保留的内容涉及未说明的,尽管常识,假设。它希望你看到该表只有一天 - “今天” - 并推断在任何一天都不会有重叠的预订。也就是说,法院的起始时间段没有与同一法院的另一个时期重叠。 (该文本提到了不同的日子,它们表示不同的表值;但是对于示例来说,不同的值是否必须在不同的日期并不重要。)
特别是对于3NF与BCNF,这也是一个糟糕的选择。当然,它受到某些FD(功能依赖性)及其与3NF与BCNF相关的相关JD(连接依赖性)的影响。但是,预订的不重叠是与3NF和BCNF无关的单独约束。
在第1天说,会员从11:00到12:00预订法庭1,在第2天,非会员从11:00到12:00为法庭1预订。
当我们说表值“满足”约束(例如FD)或“受制于”约束或“有”约束或者约束“保持”表值我们的意思是该值使约束成立。当我们对表变量(基表)说这个时,我们的意思是对于每个数据库状态中的变量值都是如此。对于此表,描述“今天”的当前预订情况,任何特定的预订情况将是大约一天 - 今天。因此,引用中涉及不同日期的重叠类型与约束无关。同样,无论预订如何变化,同一天不同时间的每个表值都将满足约束条件。
在这些情况下,对于表的任何状态,四个指定的列集是CK(候选键):
由于预订不重叠,因此每个列集的子行值在这些列下是唯一的。所以他们是超级钥匙。因为每个子集中没有更小的子集,所以它们是CK。由于没有其他列集合,因此没有其他CK。由于超级密钥的每个超集都是超级密钥,因此其他列出的集合是其他(非CK)超级密钥。
PS 该条目talk page上有几个关于网球/预订示例的部分以及页面上的混淆。该页面还有其他糟糕的例子。例如,它将非BCNF 3NF设计重构为BCNF设计,而不是通过标准无损分解将原始投影(连接回原始投影)。 (它引入了一个新专栏。)例如,它还讨论了保留依赖关系,但只有在分解为原始投影时才有意义。