【问题标题】:Normalization of a table (BCNF)表的规范化 (BCNF)
【发布时间】:2013-12-03 14:49:23
【问题描述】:

我正在尝试了解如何规范化数据库,我们老师给出的练习之一是在 BCNF 中规范化此表:

Flight(**CityDeparture,CityArrival,Day**,NationDeparture,NationArrival)

其中 (CityDeparture,CityArrival,Day) 是主键。 所以我假设:

1)城市名独立于国家是唯一的(同一个城市不能有两个国家,即使现实中不是这样),否则主键会出错。

2) 功能依赖是 城市出发->国家出发 CityArrival->NationArrival 这意味着该表甚至不在 2NF 中,因此我将其分解如下: 航班(CityDeparture,CityArrival,Day) 没有非平庸的FD,所以它在BNCF,对吧?

CityD(**CityDeparture**,NationDeparture) CityDeparture->NationDeparture

在 BNCF 因为 CityDeparture 是关键

CityA(**CityArrival**,NationArrival) CityArrival->NationArrival

在 BNCF 中,因为 CityArrival 是关键。

我还考虑了这样一个事实,即 CityA 和 CityD 可能是相同的,除非每个城市都有不同的出发/到达代码(即,如果航班从那里起飞,纽约的代码为“AAA”,如果航班降落在那里,代码为“BBB” ) 所以一个人可能只有一个 City(Name,Nation) 表,CityDeparture,CityArrival 都会引用它。

分解也应该是无损的,因为 City.Name 是两个表的通用属性,并且是 City 的关键(我对此非常不确定)

当我把这本书展示给我的老师时,它只得了 0 分,并告诉我不用进一步解释就去读这本书。现在我确实读过这本书,我发现的文章链接在这里,但老实说我一无所知,所以我征求你的意见!任何帮助将不胜感激

【问题讨论】:

    标签: database relational-database database-normalization


    【解决方案1】:

    1)城市名独立于国家是唯一的(同一个城市不能有两个国家,即使现实中不是这样),否则主键会出错。

    一方面,你的推理是正确的。另一方面,许多(大多数?)教科书规范化练习根本不包括键。通常期望您从依赖项中派生所有可能的键。也许您的老师希望您忽略现有的密钥。

    另一种可能性是您的老师希望您包含 FD {CityDeparture, CityArrival, Day} -> {NationDeparture, NationArrival}。

    另一种可能性是您的老师希望您探索主键的依赖关系。是否存在多值依赖?

    如果您的书中包含可以用铅笔和纸完成的算法(大多数都可以),请尝试以这种方式完成它。看看你得到了什么。

    【讨论】:

    • 感谢解答!习题不是从我们的书中摘录的,钥匙是老师给的;此外,我们没有研究 BNCF 之外的任何范式,所以这里不应该考虑多值依赖(也不应该有,至少乍一看)。但我确实省略了你引用的 FD,所以我想这绝对是我的错误(也许不值得 0,但那是另一个故事:P)。我确实尝试了该算法并达到了我编写的 3 个表分解(在将 2 个表合并为一个之前),但我认为我可能在某些时候犯了错误,很高兴知道我并没有完全错!
    【解决方案2】:

    你的分解

    Flight(CityDeparture,CityArrival,Day,NationDeparture,NationArrival)
    

    进入

    Flight(CityDeparture,CityArrival,Day) 
    CityD(CityDeparture,NationDeparture)
    CityA(CityArrival,NationArrival)
    

    确实为您提供 BCNF。

    关于最后一步,CityD 和 CityA 的统一:这不符合您的功能依赖关系,因此从正式数据库的角度来看是不正确的。这将通过进一步的背景知识来证明。在实践中,这在大多数情况下当然是有意义的。

    请记住,数据库规范化是一门正式学科,其算法也是如此。为您的关系替换人工名称,例如,R(A,B,C,D,E) 具有相同的键和功能依赖项 - 结果必须与重命名相同。

    编辑 这假设作为练习的一部分给出了主键和两个函数依赖项 CityDeparture->NationDeparture 和 CityArrival->NationArrival - 否则请参阅 Mike 的答案。

    【讨论】:

    • 谢谢你的回答!我最大的恐惧是我完全误解了BNCF的含义,所以知道我是对的,这让人放心。 CityD 和 CityA 的统一是在 3 个表分解之后,在我之前所说的明确假设下进行的,所以不能误解,但我想我应该学会更正式,坚持练习!我只剩下一个疑问:在评估分解中的信息丢失(将 2 个 City 关系视为一个)时,City.Name 是否可以被视为两个表的属性?
    • 在纯关系模型及其范式中,“无损”通常根据自然连接来定义。如果您只想用 City(具有 Name 和 Nation 属性)替换 CityD 和 CityA,则必须使用显式连接条件进行连接(就像在 SQL 中使用 JOIN ... ON ... 一样)。但是,当然,在您可以统一这两种关系的上下文假设下,新模式将是“无损”的……(继续下一条评论)
    • select * from OldFlight 产生与select f.*, d.nation as NationDeparture, a.nation as NationDeparture from Flight f join City d on f.CityDeparture = d.Name join City a on f.CityArrival = a.Name 相同的元组
    猜你喜欢
    • 1970-01-01
    • 2013-07-17
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多