【发布时间】:2010-12-23 14:54:29
【问题描述】:
超级键和候选键有什么区别? 我已经参考了 wiki、dotnet spider 以及 Database Concepts 第 4 版书籍。但我无法理解这个概念。谁能用恰当的例子解释一下?
【问题讨论】:
标签: database
超级键和候选键有什么区别? 我已经参考了 wiki、dotnet spider 以及 Database Concepts 第 4 版书籍。但我无法理解这个概念。谁能用恰当的例子解释一下?
【问题讨论】:
标签: database
Candidate key 是 super key,您无法从中删除任何字段。
例如,可以通过主要/次要版本或构建日期(我们假设每晚构建)来识别软件版本。
在三个字段中存储日期当然不是一个好主意,但我们假设它是出于演示目的:
year month date major minor
2008 01 13 0 1
2008 04 23 0 2
2009 11 05 1 0
2010 04 05 1 1
所以(year, major, minor) 或(year, month, date, major) 是超级键(因为它们是唯一的)但不是候选键,因为您可以删除year 或major,剩余的列集仍然是超级键。
(year, month, date) 和 (major, minor) 是候选键,因为您无法在不破坏唯一性的情况下从中删除任何字段。
【讨论】:
(year, month, date) 中删除 date 会怎样。密钥仍然是唯一的。还有(year, month, date)不是候选键?
超级键是一组或多列,用于唯一标识表中的行。
候选键是从一组超级键中选择的,我们在选择候选键时唯一注意的是:它不应该有任何冗余属性。这就是它们也被称为最小超级键的原因。
在Employee 表中有三列:Emp_Code,Emp_Number,Emp_Name
超级键:
以下所有集合都能够唯一标识员工表的行。
{Emp_Code}
{Emp_Number}
{Emp_Code, Emp_Number}
{Emp_Code, Emp_Name}
{Emp_Code, Emp_Number, Emp_Name}
{Emp_Number, Emp_Name}
候选键:
如上所述,它们是没有冗余属性的最小超级键。
{Emp_Code}
{Emp_Number}
主键:
数据库设计者正在从候选键集中选择主键。所以{Emp_Code} 或{Emp_Number} 都可以作为主键。
【讨论】:
超级键是唯一标识表中行的列的任意组合。候选键是一个超级键,它不能在不丢失唯一标识属性的情况下从中删除任何列。这种性质有时被称为最小性或(更好的)不可约性。
一般来说,超级键≠主键。主键只是选择作为主键的候选键。然而,在依赖理论中,候选键很重要,主键并不比任何其他候选键更重要。非主候选键也称为替代键。
考虑一下这个元素表:
CREATE TABLE elements
(
atomic_number INTEGER NOT NULL PRIMARY KEY
CHECK (atomic_number > 0 AND atomic_number < 120),
symbol CHAR(3) NOT NULL UNIQUE,
name CHAR(20) NOT NULL UNIQUE,
atomic_weight DECIMAL(8,4) NOT NULL,
period SMALLINT NOT NULL
CHECK (period BETWEEN 1 AND 7),
group CHAR(2) NOT NULL
-- 'L' for Lanthanoids, 'A' for Actinoids
CHECK (group IN ('1', '2', 'L', 'A', '3', '4', '5', '6',
'7', '8', '9', '10', '11', '12', '13',
'14', '15', '16', '17', '18')),
stable CHAR(1) DEFAULT 'Y' NOT NULL
CHECK (stable IN ('Y', 'N'))
);
它具有三个唯一标识符 - 原子序数、元素名称和符号。因此,这些中的每一个都是候选键。此外,除非您正在处理只能保存一行数据的表(在这种情况下,空集(列)是候选键),否则您不能拥有小于一列的候选键,所以候选键是不可约的。
考虑一个由{原子序数、元素名称、符号}组成的键。如果您为这三个字段提供一组一致的值(例如 { 6, Carbon, C }),那么您可以唯一地标识元素的条目 - 碳。然而,这在很大程度上是一个超级密钥,它不是候选密钥,因为它不是不可约的;您可以消除三个字段中的任意两个而不会丢失唯一标识属性。
作为另一个例子,考虑一个由 { atomic number, period, group } 组成的键。同样,这是行的唯一标识符; { 6, 2, 14 } (再次)标识碳。如果不是镧系元素和锕系元素,那么 { period, group } 的组合将是唯一的,但因为它们,它不是。但是,和以前一样,原子序数本身就足以唯一标识一个元素,所以这是一个超级键而不是候选键。
【讨论】:
超级键是唯一标识行的字段组合,候选键是最小超级键。
【讨论】:
简而言之:CANDIDATE KEY 是最小的 SUPER KEY。
其中 Super key 是列(或属性)的组合,用于唯一标识 RDBMS 中关系(表)中的任何记录(或元组)。
例如,考虑具有 A、B、C 和 D 列的表中的以下依赖项(给出此表只是为了简单示例,因此不涵盖 R 可能具有的所有依赖项)。
属性集(行列式)---可以识别--->(从属)
A-----> 广告
B-----> ABCD
C-----> 光盘
AC----->ACD
AB----->ABCD
ABC----->ABCD
BCD----->ABCD
现在,B、AB、ABC、BCD 标识所有列,因此这四个列符合超级键的条件。
但是,B⊂AB; B⊂ABC; B⊂BCD 因此 AB、ABC 和 BCD 不符合候选键的条件,因为它们的子集可以识别关系,因此它们不是最小的,因此只有 B 是候选键,而不是其他键。
另一件事主键是候选键中的任何一个。
感谢提问
【讨论】:
Superkey:一组属性或属性组合,用于唯一标识给定关系中的元组。 Superkey有两个属性 独特性和 可约集
候选键:具有以下两个属性的最小超级键集: 独特性和 不可约集或属性
【讨论】:
超级键: 超级键是任何属性集,其值对于表中所有可能的元组集始终保证是唯一的。
候选键: 候选键是一个“最小”超级键,表示唯一的超级键属性的最小子集。
【讨论】:
基本上,候选键是一个超级键,不能从中删除更多属性。
Super Key 唯一标识数据库表/关系中的行/元组。它由一组属性组成,这些属性组合起来可以假定值在表/关系的行/元组中是唯一的。 Candidate Key 由 Super Key 构建,迭代删除/修剪非键属性,保持不变:新创建的 Key 仍然需要唯一标识行/元组.
就属性而言,候选键可能被视为最小的超级键。
候选键可用于引用唯一的行/元组,但从 RDBMS 引擎的角度来看,维护它们的索引的负担要重得多。
【讨论】:
选择一个候选键作为主键。其他候选键称为备用键。
【讨论】:
超级键:超级键是关系(表)中的一组属性。它可以唯一地定义关系(表)中的每个元组。
候选键:我们可以说最小的超级键是候选键。候选是超级密钥的最小子集。并且可以唯一地定义每一个元组。
【讨论】: