2016-11-19 21 views
0

我有4张桌子。它们具有以下属性:不同表格中的冗余数据是否违反3NF标准化?

  1. 人(ID(主键),姓名,职业,工作地点,SecondJob,PerHour,HoursWorked,电话,办公电话)
  2. 工作(ID(外键是指人) ,标题,名称,位置,工资)
  3. SecondJob(也指人的ID(外键),标题名称)
  4. ******中国(也指人的ID(外键),姓名,电话,办公电话)

我得到每个attri的值弼像姓名,职务,从下面的伪书面方式Person表电话和办公电话:

选择(属性名称)从一个人其中id IN(人ID)

  1. 的,这对信息在不同的表(数据冗余)中重复,打破3NF标准化?

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

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

    但它是否打破3NF标准化?

+1

这在正常化方面是如此破碎。为什么“名称”到处出现?为什么没有将这些信息合并到人员记录中?如果出于性能方面的考虑而故意去规范化,您是否有方法来保持这些数据同步并理解每个领域的规范来源?为什么PhoneNumber包含*两个*号码?你在这里有很多工作来解决细节问题。 – tadman

+1

记住在正确的数据库设计中,你只有[Zero,One或Infinity](http://en.wikipedia.org/wiki/Zero_one_infinity_rule),没有两个。这就是为什么'SecondJob'作为一张表非常关注的原因。如果他们有第三份工作呢?第四?第十九?人们改变职业,升迁,转移,预计人们会换N次。同样,工资信息应该与工作相关联,而不是与个人相关联。 – tadman

+0

对你的回应的反馈: 1.虽然你的第二篇文章实际上有一些有效的观点 - 指出诸如“因规范化而破碎”之类的内容,但没有明确的原因,基本上没有用的反馈。 2. Secondjob只是一个名称。它是如何形成的,仍然允许几个不同的工作来填充它 - 用ID作外键。 3.规范化仍然依赖于主键和全部识别所述键。有重复的数据。不过,电话部分需要修改。 –

回答

0

这是否信息被重复在不同的表(数据冗余),破防3NF正常化事实呢?

编号表值或变量是或不在给定的NF中。这是独立于任何其他表。 (我们也谈到当NF中的所有表都在NF中时,数据库处于NF状态。)

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

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

或者我应该只是将值放入其他表中,并分别将表中的主键与哪些属性进行识别?

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

你的问题假设有一个误解。这不是“(独家)或”这个问题。你应该两个都做。

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

由于您可以使用查询来代替数据库的其余部分,这是多余的。如果你不适当地限制薪水价值,那么这就是糟糕的冗余。即使你做了列和约束,也会使模式复杂化。

但它是否打破3NF标准化?

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

(如果您添加工资到人,新表就不会在3NF。但后来,SQL数据库管理系统有计算列,使该行,通过与薪酬的非3NF表中的3NF的看法没有它的表。)

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