我有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)
我可以使用以下psuedo SQL语句从Person表中获取Name,Title,Phone和Workphone等每个属性的值:
Select (ATTRIBUTE NAME) FROM Person WHERE Id IN (PERSONS ID)
是否有一些信息在不同的表(数据冗余)中重复,中断(即不遵循)第三范式(3NF)?
或者应该将这些值分别放入其他表中,并说明使用表的主键识别哪个属性?
我通过从Person获取PerHour和HoursWorked来计算Job中的Salary,然后将它们相乘。我还听说这是多余的数据,因为这是可以从表中现有数据推断的数据。
但是,这是否打破了第三范式?
答案 0 :(得分:2)
在不同的表(数据冗余)中重复信息的事实是否会打破3NF规范化?
没有。表值或变量是否在给定的NF中。这与任何其他表无关。 (当所有表都在NF中时,我们也会讨论数据库处于NF状态。)
可以合理地说标准化可以消除冗余。但是有很多冗余没有通过规范化来解决。并且有很多冗余也不错。复制不一定是冗余。仅仅因为重复数据并不意味着重复“信息”。是否存在于表中所表示的数据取决于表的含义。
但您似乎认为仅仅因为在不同的表中复制数据并不违反3NF,它不违反其他良好设计原则。那是错的。此外,重要的是5NF。使用较低NF的唯一原因是SQL DBMS不能很好地支持5NF。
或者我应该单独将值放入其他表中,并推断使用表的主键识别哪个属性?
我想你是想说的,我应该只将值放在一个表中,并通过涉及共享密钥的查询重建第二个表吗?即,如果您可以通过查询数据库的其余部分来获取列中的值,那么您应该避免使用该列吗?一般来说,是的。
您的问题假设存在误解。这不是“(独家)或”的问题。你应该做到这两点。
我通过从Person获取PerHour和HoursWorked来计算Job中的薪水,然后将它们相乘。我听说这也是冗余数据,因为它是您可以从表中的现有数据中提取的数据。
鉴于数据库的其余部分,它是多余的,因为您可以使用查询。如果你没有恰当地约束薪资值那么这就是糟糕的冗余。即使您执行列和约束也会使架构复杂化。
但是它会破坏3NF标准化吗?
不,因为表的NF独立于其他表。但这并不意味着没关系。
(如果您将Salary添加到Person,则新表将不会在3NF中。但是,SQL DBMS具有计算列,通过使非SaN表与Salary a一起使用没有它的3NF表的视图。)
了解一些数据库设计方法以及它们如何应用优秀设计原则。您的表格不必要地解决了应用程序的重叠方面。在编写查询时也要了解JOIN。