【问题标题】:Identifying Functional Dependencies识别功能依赖
【发布时间】:2011-08-12 00:09:08
【问题描述】:

我有以下第一范式 (1NF) 的模式 - 即所有单元格都包含原子值:

ClientRental (clientNo, propertyNo, clientName, propertyAddress, rent, 
              rentStart, rentFinish, ownerNo, ownerName)

一般来说,客户可以从出租代理处租用许多房产。每个财产都有一个所有者。对于熟悉本书的读者,这是从 Connolly & Begg 的 Database Systems 中摘录的一个示例。

我正在尝试识别功能依赖 -> 候选键、部分依赖和传递依赖等

我正在关注一本教科书,但其中的建议解释得不太清楚。有人可以向我解释我的建议是否正确:

FD1 -> clientNo -> clientName
FD2 -> propertyNo -> propertyAddress, rent, ownerNo, ownerName
FD3 -> ownerNo -> ownerName

我确实错过了更多的功能依赖项,但我缺乏经验使我无法识别它们。显然我无法确定部分依赖关系,因为我还没有为上述关系/模式分配主键。

有人可以帮我识别其他功能依赖...我也不清楚是什么决定了传递依赖...

如果有任何需要进一步说明的地方,请告诉我。

编辑 3NF:

我的 3NF 关系:

Client {clientNo(PK), clientName}
Owner {ownerNo(PK), ownerName}
Property {propertyNo (PK), propertyAddress, rent}
ClientRental {clientNo(PK), propertyNo(PK), rentStart, rentFinish, ownerNo(FK)}

【问题讨论】:

  • 1NF 中的关系仍然必须有一个键。 ClientRental 的关键是什么?
  • 关键是clientNo & propertyNo
  • 将 ownerNo 作为 ClientRental 的一个属性实际上没有任何意义。该表的键是 {clientNo, propertyNo}。非正式地,这意味着所有者是谁部分取决于租用这个地方的人。这当然不是真的。不管是谁租的,主人都是一样的。我希望 ownerNo 成为 Property 的一个属性。

标签: database database-design schema normalization


【解决方案1】:

要改进到 2NF,请识别仅依赖于候选键的一部分而不是全部的非键属性。首先确定集合 {clientName, propertyAddress,rent,rentStart,rentFinish,ownerNo,ownerName} 中的任何属性是否仅依赖于 clientNo 或 propertyNo。

现在,您将在网上遇到的问题之一是函数依赖关系实际上是由值决定的,而不是由列名决定的。没有具有代表性的样本值,我们不得不猜测一下。不过可能

clientNo -> clientName
propertyNo -> propertyAddress, ownerNo, ownerName

所以我们可以这样分解 ClientRental。

Relation "clients"         { (clientNo), clientName}
Relation "properties"      { (propertyNo), propertyAddress, ownerNo, ownerName}
Relation "ClientRental"    { (clientNo, propertyNo), rent, rentStart, rentFinish}

在美国,propertyNo -> 租金是不正确的。 (您的 FD2。除非 rent 您指的是要价。)在美国,租约决定租金,从法律上讲,租约必须包括地址和租户。 (实际上是所有的租户。但这是一个不同的问题。)

由于“client”和“properties”在它们的候选键中只有一列,它们必须在 2NF 中。我认为所有这三个关系都在 2NF 中。

你能自己处理改进到 3NF(消除传递依赖)吗?

稍后。 . .

是的,这里至少有一个传递依赖:propertyNo -> ownerNo -> ownerName。通过引入所有者关系来消除传递依赖。

Relation "clients"         { (clientNo), clientName}
Relation "properties"      { (propertyNo), propertyAddress, ownerNo}
Relation "owners"          { (ownerNo), ownerName}
Relation "ClientRental"    { (clientNo, propertyNo), rent, rentStart, rentFinish}

关系“客户”、“财产”和“所有者”在 3NF 中。在现实世界中,房产通常由多个人或企业拥有,并且它们也经常出租给多个人或企业。但是这种问题与标准化没有任何关系。 (直到你决定支持现实世界的情况。)

还有什么?

【讨论】:

  • 感谢您的回复 - 我已经设计了 3NF 所需的关系。租金是指月租——在租用前商定的。为了方便起见,我假设这是预先确定的。
【解决方案2】:

大概有 4 种关系应该被识别:

  • 客户
  • 所有者
  • 财产
  • 出租

那么,给定 ClientRental 中的属性,我们可以推理:

  • 客户:{clientNo} ⟶ {clientName}
  • 所有者:{ownerNo} ⟶ {ownerName}
  • 属性:{propertyNo} ⟶ {propertyAddress, ownerNo}
  • 出租:{rentStart, propertyNo} ⟶ {clientNo, propertyNo,rentFinish,rent}

对于给定的属性,开始日期是唯一的,所以组合可以提供一个键(行列式);您也可以争辩说rentFinish 和propertyNo 会提供密钥。

租金可能是财产和租金的属性;前者是要价租金,后者是所得租金。更现实的租金要价可能会因一年中的不同时间而有所不同 - 房产在夏季月份可能比冬季月份更有价值。

对于传递依赖,请考虑原始的 ClientRental 关系。 propertyNo 标识了 ownerNo(和 ownerName),因此其中潜伏着传递依赖。

【讨论】:

  • 好的,所以 ownerNo -> ownerName 是一个传递依赖,因为 ownerNo 和 ownerName 可以由 propertyNo 确定?此外,您似乎试图在识别依赖关系之前识别关系,而这本书我说过使用函数依赖关系来确定需要关系......?
  • @user559142:我不会按照书中的规定去做,不。我通常会在处理函数依赖等之前确定主要关系。但是,如果我提出一个设计,然后发现在某些关系中存在重复或传递依赖,那么我会重构为单独的组成关系。我想我可以假设一个天真的设计师可能会提出所描述的设计,但它必须是一个非常天真的设计师。
  • 好的,谢谢您的建议。您能否确认我对传递依赖有正确的理解?
  • @user559142:至于传递关系,这是个棘手的问题...如果您接受 {rentStart, propertyNo} 是复合 ClientRental 关系模式的候选键,则 propertyNo 确定所有者,但是因为决定所有者的不是“钥匙,整个钥匙,只有钥匙”(rentStart 不会影响所有者 - 至少在没有财产的连续所有者的记录时,以及每个人拥有房产的日期)。因此,存在传递依赖,以及对部分键的依赖,这表明非 BCNF。
  • 如果我有 clientNo & propertyNo 作为主键怎么办?那么作为 propertyNo -> pAddress, rent, ownerNo, ownerName 那么 ownerNo -> ownerName 是传递依赖吗?这是否也意味着 ownerNo 和 ownerName 也部分依赖于主键?
猜你喜欢
  • 2018-04-24
  • 2013-03-25
  • 2011-12-08
  • 2016-08-13
  • 1970-01-01
  • 2021-07-05
  • 2013-09-10
相关资源
最近更新 更多