【发布时间】:2017-04-03 10:57:53
【问题描述】:
我有 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)
我可以使用以下伪 SQL 语句从 Person 表中获取 Name、Title、Phone 和 Workphone 等每个属性的值:
Select (ATTRIBUTE NAME) FROM Person WHERE Id IN (PERSONS ID)
-
某些信息在不同的表中重复(数据冗余)这一事实是否打破(即不遵循)第三范式 (3NF)?
或者应该将这些值单独放入其他表中,并说明什么属性与表的主键标识?
-
我通过从 Person 获取 PerHour 和 HoursWorked 来计算工作中的薪水,然后将它们相乘。我还听说这是冗余数据,因为您可以从表格中的现有数据推断出这些数据。
但是,这是否违反了第三范式??
【问题讨论】:
-
这在标准化方面非常糟糕。为什么“名字”随处可见?为什么这些信息没有合并到 Person 记录中?如果您出于性能原因故意去规范化,您是否有方法使这些数据保持同步并了解每个字段的规范来源?为什么 PhoneNumber 包含 两个 号码?你需要做很多工作来解决细节问题。
-
记住在正确的数据库设计中你只有Zero, One or Infinity,没有两个。这就是为什么
SecondJob作为表格非常令人担忧。如果他们有第三份工作怎么办?第四个?十九?人们转行,升职,调动,可以预料人们会转换N次。同样,工资信息应该与工作相关联,而不是与人员相关联。 -
对您的回复的反馈: 1. 虽然您的第二篇文章实际上有一些有效的观点 - 指出诸如“在规范化方面如此糟糕”之类的东西,没有明确的指向为什么,基本上没有用回馈。 2. Secondjob 只是一个名字。它是如何形成的,仍然允许几个不同的工作来填充它——通过 ID 引用外键。 3. 规范化仍然依赖于主键和对所述键的整体识别。存在重复数据。不过,手机部分需要修改。
-
“将值分别放入其他表中,原因是什么属性与表的主键标识”不清楚。
-
主题的主要关注点是不同表中的值重复。这意味着我提出的一个建议是将重复值放入单独的表中 - 而不是在多个表中重复相同的值。即:一张表中的姓名和 ID,一张表中的工作和电话号码等。
标签: mysql database-normalization