superkey可以包含不属于主键的内容吗?
答案 0 :(得分:1)
从逻辑上讲,是的。如果表X
列{A, B, C}
且A
是主键,则{A}
,{A, B}
,{A, C}
和{A, B, C}
都是超级密钥,因为如果你有这些集合中的任何一个,你知道所有行中的值(如果它存在。)
但是,出于某些目的,它不被视为SQL中的密钥,例如如果表Y
包含A
和B
,您可以不通常定义外键Y(A, B) REFERENCES X(A, B)
,因为{A, B}
不是主要的键。如果您希望能够声明该外键,则必须在UNIQUE
上添加另一个X(A, B)
约束,这种约束效率低,因为它会复制部分主键。
在我看来,这是SQL的许多缺陷之一。
答案 1 :(得分:0)
超级密钥可以包含非唯一标识符或主键。但是像复合主键一样,组合必须是唯一的。 标准化数据集具有包含与数据库目的相关的特定实体的数据的表。因此,例如,拥有员工数据库的公司有一个员工表,可能有另一个员工行动历史表(促销,评论,薪资调整等)。
如果密钥有资格唯一地选择表中的特定行,那么密钥就是候选密钥,这样该表中的数据完全依赖于该密钥而不需要任何其他内容。
假设员工表是基于美国的。它可能有两个候选人 - 一个可能是员工编号,另一个是员工的社会安全号码。如果公司要求员工拥有SSN ......,可能会发生这种情况。
好的,两名候选人 - 员工编号和SSN。
您必须选择一个作为主键,在这种情况下,另一个成为另一个依赖于键选择的数据字段。
在美国,根据两个因素,员工人数可能会被选为PK,将SSN作为次要领域。首先,对SSN的使用存在法律限制,因为它是个人识别信息,促进身份盗用。其次,一个人可能申请了SSN但尚未获得SSN。因此,不能依赖SSN,从而使其无效为候选人。
因此,主键和候选键之间的区别在于其他候选人输掉了比赛。
SUPERKEY本质上是一个超定的密钥,保证是唯一的选择器 - 但这并不是最小的。在我的员工表示例中,(员工编号,SSN)的组合将是超级密钥。请注意,超级密钥通常包含主键。
还有更多的东西。该定义提到了一个超级密钥,其基数与整个记录的基数相同。 (最终的关键,完全不切实际,因为您必须事先知道整个记录才能将其用作关键...)
“基数”只是说,当我查询单个键值的表时,返回记录的平均数是多少。对于正确的主键,对于表中存在的所有值,始终只有1。 (显然,对于表中不存在的数字,它为零。)对于非唯一键,基数将大于1。频谱另一端的通常示例是对于大小为N的表,使用“Gender”作为键将为您提供N / 2的基数。请记住,因为它是AVERAGE返回大小,所以表格的分布不一定非常完美。
希望有所帮助。