【问题标题】:Normalisation - SQL - 3NF规范化 - SQL - 3NF
【发布时间】:2016-01-01 06:23:55
【问题描述】:

我正在设计一个 SQL 数据库,它需要是一个五表数据库才能满足 Air-Crewe 的要求。到目前为止,我有以下内容:

我为 UNF 准备了这个:

CrewID, Crew Type, Title, Forename, Surname, Gender, CAALicenceNum, FlightID, FlightNum, IATADep, IARAArr, Date, SchDep,SchArr, Comments, A/CType, A/CReg, A/CManuf

我有这个用于 1NF:

TBLCrew(CrewID[PrimaryKey], CrewType, CrewTitle, Forename, Surname, gender, CAALicenceNum, FlightID*)

TBLFlight(FlightID[PrimaryKey], FlightNumber, IATADep, IATAArr, Date, SchArr, cmets, A/CType, A/CReg, A/CManuf)

我有这个用于 2NF:

TBLCrew(CrewID[PrimaryKey], CrewType, CreweTitle, Forename, Surname, gender, CAALicenceNum)

TBLFlight(FlightID[PrimaryKey], FlightNum, IATADep, IATAArr, Date, SchArr, cmets, A/CType, A/CReg, A/CManuf)

TBLCrewFlight(CreweID[composite/compoundKey], FlightID[composite/compoundKey])

3NF 需要分成五个表,但我不知道如何实现 - 谁能帮帮我?或者,如果我在上面的规范化中犯了错误,请纠正我(我可能是规范化的新手)

【问题讨论】:

  • 您可以为 A/CTypeCrewType 实体创建另外 2 个表。
  • 我可能会将 Crew Type 和 Title 放在 2NF 的 TBLCrewFlight 中,因为飞行员可能是飞行员或副驾驶,如果有首席飞行助理,它也可能因航班而异。这在一定程度上取决于企业如何定义事物。
  • 感谢大家的快速响应,我在上面添加了一个 UNF 表格以说明不同类型的单元格值,感谢您抽出宝贵时间帮助我!
  • 我不太清楚 TBLCrew 行是描述一个 crew(一群人)还是一个 crew member(一个人) )。
  • 对不起,TBL 船员是为单个船员服务的

标签: sql normalization


【解决方案1】:

接受的答案可以有更多的飞机用于飞行,我认为这是不正确的。

TBLCrew(CrewID[PrimaryKey], CrewType, CreweTitle, Forename, Surname, gender, CAALicenceNum)

TBLFlight(FlightNum[PrimaryKey], IATADep, IATAArr, Date, SchArr, A/CReg[composite/compoundKey])

TBLCrewFlight(CreweID[composite/compoundKey], FlightNum[composite/compoundKey], Comments)

Aircraft(A/CReg[PrimaryKey], A/CType[composite/compoundKey])

TBL_A/CType(A/CType[PrimaryKey], A/C Manuf)

【讨论】:

  • 这实际上是正确的。一次飞行中不应有超过一架飞机。根据“飞行”的含义,这个答案比我的要好。
【解决方案2】:

我想你实际上已经快到了。我会将飞机信息拆分到自己的表格中

Aircraft(CraftId[PimaryKey], A/CType, A/C Rep, A/C Manuf)

然后将飞机分配给航班

AircraftFlight(CraftId, FlightId) [Composite Key]

【讨论】:

    【解决方案3】:

    首先-我什至不确定第一种形式。 Comments 意味着评论的多个实例,因此它可能不是原子的,我也会为它们制作一个表格。它将具有三个属性 - comment_ID、comment、FlightID。

    在第三种形式中,表的每个非主属性都非传递地依赖于表的每个超键。所以通俗地说,如果你在逻辑上识别出依赖于另一个非关键属性的属性,你需要将它们转换成另一个表。

    如果性别取决于名字是有争议的。其他分解有些困难,因为我没有列的描述(不完全确定它们代表什么)。

    不过在这里我提出一些我的推测:

    • CrewTitle 可能取决于性别 - bam new table
    • 出发和到达取决于航班号 - bam new table
    • A/C 类型和制造商可能取决于 A/C Reg - bam new table

    但是,您应该对各个列有更好的了解,因此您应该自己做出这些决定。这些示例应该可以帮助您理解第三种形式的概念。

    【讨论】:

      猜你喜欢
      • 2011-04-25
      • 2012-03-31
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 2014-09-23
      • 2014-09-22
      • 2014-07-09
      • 1970-01-01
      相关资源
      最近更新 更多