我有4张Table。它们每个都包含以下属性:
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语句从“人”表中获取每个属性的值,例如“名称”,“标题”,“电话”和“工作电话”:
Select (ATTRIBUTE NAME) FROM Person WHERE Id IN (PERSONS ID)
还是应该将值分别放在其他表中,并说明该表的主键标识了哪个属性?
但是,这会破坏第三范式吗?
在不同表(数据冗余)中重复信息的事实是否违反了3NF规范?
否。表值或变量在给定NF中或不在给定NF中。这独立于任何其他表。(当数据库中的所有表都位于该NF中时,我们也谈到了该数据库位于该NF中。)
可以说标准化可以消除冗余。但是有很多冗余无法通过规范化解决。而且有很多不错的冗余。并且重复不一定是冗余。仅仅重复数据并不意味着重复“信息”。数据在表中的含义取决于表的含义。
但是您似乎认为,仅仅因为在不同表中复制数据并没有违反3NF,它就没有违反其他良好设计原则。错了 另外,重要的是5NF。使用较低NF的唯一原因是SQL DBMS不能很好地支持5NF。
还是我应该将值分别放入其他表中,并说明用表的主键标识的属性是什么?
我猜您是想说:我是否应该仅将值分别放在一个表中,并通过涉及共享密钥的查询来重建第二个表?即,如果您可以通过查询数据库的其余部分来获取列中的值,那么您应该避免拥有该列吗?一般来说,是的。
您的问题假设有误解。这里不是“(专有)或”的问题。您应该两者都做。
我通过从Person中获得PerHour和HoursWorked来计算Job中的薪水,然后将它们相乘。我听说这也是冗余数据,因为它是您可以从表中的现有数据中推断出的数据。
对于数据库的其余部分,这是多余的,因为您可以改用查询。而且,如果您没有适当地限制薪水值,那将是很糟糕的冗余。即使您这样做,列和约束也会使架构复杂化。
但这会破坏3NF规范化吗?
否,因为表的NF独立于其他表。但这并不意味着可以。
(如果将Salary添加到Person,则新表将不在3NF中。但是,然后,SQL DBMS通过使带有Salary的非3NF表成为没有3NF表的视图的方式来计算出可以实现此功能的列。)
了解一些数据库设计方法以及它们如何应用好的设计原理。您的表不必要地解决了应用程序的重叠方面。还可以在编写查询中了解有关JOIN的信息。