首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同表中的数据冗余是否不遵循第三范式(3NF)?

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

Stack Overflow用户
提问于 2016-11-19 18:42:37
回答 1查看 453关注 0票数 1

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
Select (ATTRIBUTE NAME) FROM Person WHERE Id IN (PERSONS ID)
  1. 有些信息是在不同的表(数据冗余)、中断(即,而不是遵循)第三范式(3NF)中重复的呢?还是应该将这些值分别放到其他表中,并说明用表的主键标识什么属性?
  2. 我通过从个人那里得到PerHour和HoursWorked来计算工作中的工资,然后乘以它们。我还听说这是多余的数据,因为您可以从表中的现有数据中推断出is数据。 但是,这是否破坏了第三种正常形式??
EN

回答 1

Stack Overflow用户

发布于 2016-11-19 20:51:18

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

不是的。表值或变量是否在给定的NF中。这是独立于任何其他表。(当数据库的所有表都在NF中时,我们也会讨论它在NF中的情况。)

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

但是,您似乎认为,仅仅因为复制不同表中的数据并不违反3NF,也不违反其他良好设计原则。这是错误的。另外,重要的是5NF。使用较低的NFs的唯一原因是SQL不支持5NF。

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

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

你的问题被误解了。这不是“(排他性)”或“这里”的问题。你应该两者兼得。

我通过从个人那里得到PerHour和HoursWorked来计算工作中的工资,然后乘以它们。我听说这也是多余的数据,因为它是可以从表中现有数据中提取出来的数据。

考虑到数据库的其余部分,它是多余的,因为您可以使用查询。如果不适当地限制薪资值,那么这就是糟糕的冗余。即使您执行了列和约束,架构也会变得复杂。

但它是否破坏了3NF的规范化?

不,因为表的NF独立于其他表。但这并不意味着一切都好。

(如果将工资加到人身上,新表将不在3NF中。但是,SQL计算了列,使非3NF表与工资一起成为不带工资的3NF表的视图,从而实现了这一点。)

学习一些数据库设计方法,以及它们如何应用良好设计的原则。您的表不必要地处理应用程序的重叠方面。还可以在编写查询时了解有关联接的信息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40696601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档