小编典典

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

sql

我有4张Table。它们每个都包含以下属性:

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)

我可以使用以下伪SQL语句从“人”表中获取每个属性的值,例如“名称”,“标题”,“电话”和“工作电话”:

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

还是应该将值分别放在其他表中,并说明该表的主键标识了哪个属性?

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

但是,这会破坏第三范式吗?


阅读 444

收藏
2021-04-10

共1个答案

小编典典

在不同表(数据冗余)中重复信息的事实是否违反了3NF规范?

否。表值或变量在给定NF中或不在给定NF中。这独立于任何其他表。(当数据库中的所有表都位于该NF中时,我们也谈到了该数据库位于该NF中。)

可以说标准化可以消除冗余。但是有很多冗余无法通过规范化解决。而且有很多不错的冗余。并且重复不一定是冗余。仅仅重复数据并不意味着重复“信息”。数据在表中的含义取决于表的含义。

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

还是我应该将值分别放入其他表中,并说明用表的主键标识的属性是什么?

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

您的问题假设有误解。这里不是“(专有)或”的问题。您应该两者都做。

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

对于数据库的其余部分,这是多余的,因为您可以改用查询。而且,如果您没有适当地限制薪水值,那将是很糟糕的冗余。即使您这样做,列和约束也会使架构复杂化。

但这会破坏3NF规范化吗?

否,因为表的NF独立于其他表。但这并不意味着可以。

(如果将Salary添加到Person,则新表将不在3NF中。但是,然后,SQL DBMS通过使带有Salary的非3NF表成为没有3NF表的视图的方式来计算出可以实现此功能的列。)

了解一些数据库设计方法以及它们如何应用好的设计原理。您的表不必要地解决了应用程序的重叠方面。还可以在编写查询中了解有关JOIN的信息。

2021-04-10