什么是KISS(保持简单,愚蠢)的方式来记住Boyce-Codd的正常形式是什么以及如何采用非标准化的表格和BCNF呢?
维基百科的信息:对我来说不是很有帮助.
Chris Date的定义实际上非常好,只要你明白他的意思:
每个属性您的数据必须分成单独的,不同的属性/列/值,这些属性/列/值不依赖于任何其他属性.您的全名是一个属性.你的生日是一个属性.您的年龄不是属性,它取决于当前日期,而不是您的出生日期的一部分.
必须代表一个事实每个属性都是一个事实,而不是事实的集合.更改属性中的一位会改变整个含义.你的出生日期是事实.你的全名是一个事实吗?好吧,在某些情况下,它是,因为如果你改变你的姓氏,你的全名是不同的,对吧?但对于一个系谱学家来说,你有姓氏和姓氏,如果你改姓,你的姓氏不会改变,所以他们是不同的事实.
关于钥匙,一个属性是特殊的,它是一个关键.密钥是一个属性,对于数据中的所有信息必须是唯一的,并且永远不能更改.您的全名不是关键,因为它可以更改.您的社会保险号码不是关键因素,因为它们可以重复使用.即使组合永远不能重复使用,您的SSN加上生日也不是关键,因为属性不能是两个事实的组合.GUID是关键.增加并永不重用的数字是关键.
整个关键,只有钥匙必须足够[ 并且必要!]识别你的价值观; 您不能拥有由不同密钥表示的相同数据,也不能使用密钥列的子集来识别事实.假设您有一个带有GUID密钥,名称和地址值的地址簿.如果它们代表不同的人并且不是"相同的数据",则可以使用不同的密钥出现两次相同的名称.如果玛丽琼斯在会计上改名为玛丽史密斯,玛丽琼斯在销售中也不会改变她的名字.另一方面,如果玛丽史密斯和约翰史密斯拥有相同的街道地址并且它实际上是相同的地方,则不允许这样做.您必须使用街道地址和新密钥创建新的键/值对.
您也不能使用此新单街道地址的密钥作为地址簿中的值,因为现在相同的街道地址密钥将被表示两次.相反,您必须使用地址簿键和街道地址键的值创建第三个键/值对; 您可以通过匹配此组值中的书籍密钥和地址键来查找某人的街道地址.
而且关键是什么除了标识您的价值观的钥匙外,别无其他.例如,如果您被允许使用"泰姬陵"的地址(假设只有一个),则不允许在同一记录中使用城市值,因为如果您知道地址,您也会知道该城市.这也将开启在不同城市中有不止一个泰姬陵的可能性.相反,您必须再次创建具有唯一值的辅助位置键,例如Taj,DC中的白宫等,以及他们的城市.或者禁止一个城市独有的"地址".
以下是第三范式维基百科页面的一些有用摘录:
比尔肯特以这种方式定义第三范式:
每个非关键属性"必须提供关于密钥,整个密钥以及密钥的事实."
要求非关键属性依赖于"整个密钥",确保表格在2NF; 进一步要求非关键属性依赖于"只有关键",确保表格在3NF.
Chris Date使用Kent的助记符来定义Boyce-Codd Normal Form:
"每个属性必须代表一个关于密钥,整个密钥以及密钥的事实." 这里的要求涉及表中的每个属性,而不仅仅是非关键属性.
当表具有多个复合候选键,并且一个候选键内的属性依赖于另一个候选键的一部分时,这就起作用.第三范式不会禁止这一点,因为它排除了关键属性.但BCNF也将规则应用于关键属性.
至于如何使表满足BCNF,您需要使用另一个属性并可能通过将属性拆分到另一个表来表示额外的依赖关系.