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

Mysql 不同表中的数据冗余是否不遵循第三范式(3NF)?,mysql,database-normalization,Mysql,Database Normalization,我有四张桌子。其中每个属性都包含以下属性: 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 (I

我有四张桌子。其中每个属性都包含以下属性:

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表中获取每个属性的值,如名称、标题、电话和工作电话:

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

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

  • 我通过计算每个人每小时和每小时的工作时间来计算这份工作的工资,然后将它们相乘。我还听说这是冗余数据,因为这是可以从表中现有数据推断出来的数据

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

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

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

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

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


    或者我应该将这些值分别放入其他表中,并说明哪些属性与表的主键相标识

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

    你的问题带有误解。这不是“独家”或“在这里”的问题。你应该两者都做

    我通过计算每个人每小时和每小时的工作时间来计算这份工作的工资,然后将它们相乘。我听说这也是冗余数据,因为它是可以从表中的现有数据中提取的数据

    考虑到数据库的其余部分,它是多余的,因为您可以使用查询。如果你没有适当地约束薪资值,那就是糟糕的冗余。即使您这样做,列和约束也会使模式复杂化

    但它会破坏3NF规范化吗

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

    (如果您将Salary添加到Person,则新表将不在3NF中。但是,SQL DBMS通过将包含Salary的非3NF表设置为不包含它的3NF表的视图,计算出的列使其可以。)


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

    这在规范化方面是非常不可靠的。为什么“名字”无处不在?为什么这些信息没有整合到个人记录中?如果出于性能原因而有意取消规范化,您是否有方法保持此数据同步并了解每个字段的规范源?为什么PhoneNumber包含两个数字?这里有很多工作要做,以解决细节问题。请记住,在正确的数据库设计中,只有两个。这就是为什么
    SecondJob
    作为一个表格非常令人担忧的原因。如果他们有第三份工作呢?第四个?十九岁?人们转行、升职、调职,预计人们会转行N次。同样,工资信息应该与工作相关,而不是与人相关。虽然你的第二篇文章实际上有一些有效的观点——指出诸如“在规范化方面如此破碎”之类的东西,但没有明确的指向原因的指针,这基本上是没有用的反馈。2.Secondjob只是一个名字。它是如何形成的,仍然允许几个不同的工作来填充它-使用ID为3的外键refereal。规范化仍然依赖于主键和所述键的整体识别。数据重复。不过,电话部分需要修改。“将值分别放在其他表中,原因是表的主键标识的属性”不清楚。该主题主要关注的是不同表中的值重复。这意味着我提出的一个建议是将重复的值放在单独的表中,而不是在多个表中重复相同的值。即:一个表格中的姓名和ID,一个表格中所述工作的工作和电话号码等。