Database 确定超级密钥

Database 确定超级密钥,database,database-design,key,3nf,bcnf,Database,Database Design,Key,3nf,Bcnf,今日的法庭预约 表中的每一行表示网球俱乐部的场地预订,该俱乐部有一个硬场地(1号场地)和一个草地场地(2号场地) 预订由法院和法院保留的期限确定 此外,每个预订都有一个与之关联的费率类型。有四种不同的费率类型: 节省,用于会员预订的1号球场 标准,适用于非会员预订的1号球场 高级A,适用于会员预订的2号球场 PREMIUM-B,适用于非会员预订的2号球场 表的超级键是: S1={球场,开始时间} S2={球场,结束时间} S3={速率类型,开始时间} S4={速率类型,结束时间}

今日的法庭预约

  • 表中的每一行表示网球俱乐部的场地预订,该俱乐部有一个硬场地(1号场地)和一个草地场地(2号场地)
  • 预订由法院和法院保留的期限确定
  • 此外,每个预订都有一个与之关联的费率类型。有四种不同的费率类型:
    • 节省,用于会员预订的1号球场
    • 标准,适用于非会员预订的1号球场
    • 高级A,适用于会员预订的2号球场
    • PREMIUM-B,适用于非会员预订的2号球场
表的超级键是:

  • S1={球场,开始时间}
  • S2={球场,结束时间}
  • S3={速率类型,开始时间}
  • S4={速率类型,结束时间}
  • S5={球场,开始时间,结束时间}
  • S6={速率类型、开始时间、结束时间}
  • S7={场地,费率类型,开始时间}
  • S8={场地,费率类型,结束时间}
  • ST={Court,Rate Type,Start Time,End Time},普通超键
注意,即使在上表中,开始时间和结束时间 每个属性都没有重复的值,我们仍然需要 承认在其他一些日子里,第一场和第二场有两种不同的预订 第二场可以同时开始,也可以同时结束。这是 {开始时间}和{结束时间}不能被视为 表的超级键

S1={Court,Start Time}是一个超级键吗

比如说,在第一天,一名会员从11:00到12:00登记一号球场,在第二天,一名非会员从11:00到12:00登记一号球场

表中的记录将是 {1,11:00,12:00,SAVER}和{1,11:00,12:00,STANDARD}


显然S1={Court,Start Time}不是超级键。还是我错了?

这个例子是一个糟糕的选择,因为要理解表格应该包含哪些内容,需要进行未陈述的假设,尽管这是常识。它希望您看到该表仅为一天--“今天”--并推断在任何一天都不会有重叠预订。即一个法院的无起止时间段与同一法院的另一个起止时间段重叠。(文本中提到了不同的日期,它们表示不同的表值;但对于示例来说,不同的值是否必须在不同的日期并不重要。)

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

比如说,在第一天,一名会员从11:00到12:00登记一号球场,在第二天,一名非会员从11:00到12:00登记一号球场

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

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

  • S1={球场,开始时间}
  • S2={球场,结束时间}
  • S3={速率类型,开始时间}
  • S4={速率类型,结束时间}
因为预订不重叠,所以这些列集合中每个列的子代码值在这些列下都是唯一的。所以他们是超级钥匙。因为没有更小的子集是这样的,所以它们是CKs。由于它不适用于其他列集,因此不存在其他CKs。由于超键的每个超集都是超键,因此列出的其他集是其他(非CK)超键

PS该条目上有几个章节介绍了网球/预订示例和页面上的困惑。这一页还有其他糟糕的例子。例如,它将非BCNF 3NF设计重组为BCNF设计,但不是通过标准无损分解为原始(连接到它的)投影。(它引入了一个新的专栏。)例如,它还谈到了保留依赖关系,但这只有在分解为原始的投影时才有意义