不同表格中的数据冗余是否遵循第三范式(3NF)?

时间:2016-11-19 18:42:37

标签: mysql database-normalization

我有4张桌子。它们中的每一个都包含以下属性:

Table 1 :
 Person (Id (Primary key), Name, Occupation, Location, SecondJob, PerHour, HoursWorked, Phone, Workphone)

Table 2 :
 Job (Id (Foreign key that refers to Person), Title, Name, Location, Salary)

Table 3 :
 SecondJob (Id (Foreign key that refers to Person), Title, Name)

Table 4:
 PhoneNumber (Id (Foreign key that refers to Person), Name, Phone, Workphone)

我可以使用以下psuedo SQL语句从Person表中获取Name,Title,Phone和Workphone等每个属性的值:

Select (ATTRIBUTE NAME) FROM Person WHERE Id IN (PERSONS ID)
  1. 是否有一些信息在不同的表(数据冗余)中重复,中断(即不遵循)第三范式(3NF)?

    或者应该将这些值分别放入其他表中,并说明使用表的主键识别哪个属性?

  2. 我通过从Person获取PerHour和HoursWorked来计算Job中的Salary,然后将它们相乘。我还听说这是多余的数据,因为这是可以从表中现有数据推断的数据。

    但是,这是否打破了第三范式?

1 个答案:

答案 0 :(得分:2)

  

在不同的表(数据冗余)中重复信息的事实是否会打破3NF规范化?

没有。表值或变量是否在给定的NF中。这与任何其他表无关。 (当所有表都在NF中时,我们也会讨论数据库处于NF状态。)

可以合理地说标准化可以消除冗余。但是有很多冗余没有通过规范化来解决。并且有很多冗余也不错。复制不一定是冗余。仅仅因为重复数据并不意味着重复“信息”。是否存在于表中所表示的数据取决于表的含义。

但您似乎认为仅仅因为在不同的表中复制数据并不违反3NF,它不违反其他良好设计原则。那是错的。此外,重要的是5NF。使用较低NF的唯一原因是SQL DBMS不能很好地支持5NF。

  

或者我应该单独将值放入其他表中,并推断使用表的主键识别哪个属性?

我想你是想说的,我应该只将值放在一个表中,并通过涉及共享密钥的查询重建第二个表吗?即,如果您可以通过查询数据库的其余部分来获取列中的值,那么您应该避免使用该列吗?一般来说,是的。

您的问题假设存在误解。这不是“(独家)或”的问题。你应该做到这两点。

  

我通过从Person获取PerHour和HoursWorked来计算Job中的薪水,然后将它们相乘。我听说这也是冗余数据,因为它是您可以从表中的现有数据中提取的数据。

鉴于数据库的其余部分,它是多余的,因为您可以使用查询。如果你没有恰当地约束薪资值那么这就是糟糕的冗余。即使您执行列和约束也会使架构复杂化。

  

但是它会破坏3NF标准化吗?

不,因为表的NF独立于其他表。但这并不意味着没关系。

(如果您将Salary添加到Person,则新表将不会在3NF中。但是,SQL DBMS具有计算列,通过使非SaN表与Salary a一起使用没有它的3NF表的视图。)

了解一些数据库设计方法以及它们如何应用优秀设计原则。您的表格不必要地解决了应用程序的重叠方面。在编写查询时也要了解JOIN。