2

根据维基百科

今天的法庭预订

在此处输入图像描述

  • 表格中的每一行代表一个网球俱乐部的场地预订,该俱乐部有一个硬地球场(Court 1)和一个草地球场(Court 2)
  • 预订由其法院和法院保留的期限定义
  • 此外,每个预订都有与之关联的费率类型。有四种不同的费率类型:
    • SAVER,适用于会员进行的 Court 1 预订
    • 标准,适用于非会员进行的 Court 1 预订
    • PREMIUM-A,适用于会员预订的 Court 2
    • PREMIUM-B,适用于非会员进行的 Court 2 预订

该表的超级键是:

  • S1 = {球场,开始时间}
  • S2 = {法庭,结束时间}
  • S3 = {速率类型,开始时间}
  • S4 = {费率类型,结束时间}
  • S5 = {球场、开始时间、结束时间}
  • S6 = {费率类型、开始时间、结束时间}
  • S7 = {球场、费率类型、开始时间}
  • S8 = {法院、费率类型、结束时间}
  • ST = {Court, Rate Type, Start Time, End Time},平凡的超级键

请注意,即使在上表中,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},不是超级键。还是我错了?

4

1 回答 1

2

这个例子是一个糟糕的选择,因为要理解该表应该包含什么涉及未说明的假设,尽管是常识。它希望您看到该表仅适用于一天——“今天”——并推断在任何一天都不会有重叠的预订。即没有一个法院的开始结束时间段与同一法院的另一个时间段重叠。(文本提到了不同的日期,它们表示不同的表值;但对于示例而言,不同的值是否必须在不同的日期并不重要。)

特别是对于 3NF 与 BCNF,这也是一个糟糕的选择。当然,它受制于与 3NF 和 BCNF 相关的某些 FD(功能依赖)及其相关的 JD(连接依赖)。但是预订的不重叠是与 3NF 和 BCNF 无关的单独约束。

假设在第 1 天,会员从 11:00 到 12:00 预订球场 1,在第 2 天,非会员从 11:00 到 12:00 预订球场 1。

当我们说一个表“满足”一个约束(例如 FD)或“受制于”一个约束或“具有”一个约束或一个约束“包含”一个表时,我们的意思是该值使约束为真. 当我们谈到一个表变量(基表)时,我们的意思是对于每个数据库状态中的变量值都是如此。对于此表,描述“今天”的当前预订情况,任何特定的预订情况都将是大约一天--今天。因此,报价中涉及不同日期的重叠与约束无关。同样,来自同一天不同时间的每个表值都将满足约束本身,无论预订如何变化。

在这些情况下,对于表的任何状态,指定的四组列都是 CK(候选键):

  • S1 = {球场,开始时间}
  • S2 = {法庭,结束时间}
  • S3 = {速率类型,开始时间}
  • S4 = {费率类型,结束时间}

因为预订不重叠,所以这些列集中每个列的子行值在这些列下是唯一的。所以它们是超级键。由于对于每个较小的子集都是如此,因此它们是 CK。由于没有其他列集是正确的,因此没有其他 CK。由于超键的每个超集都是超键,因此列出的其他集合是其他(非 CK)超键。

PS该条目的讨论页面上有几个部分是关于网球/预订示例和页面上的混淆。该页面还有其他不良示例。例如,它将非 BCNF 3NF 设计重构为 BCNF 设计,但不是通过标准无损分解为原始投影(连接回它)。(它引入了一个新列。)例如,它还谈到了保留依赖关系,但这仅在分解为原始投影时才有意义。

于 2016-02-16T23:03:18.680 回答