10

在这里我发现了这个:

定义:数据库表中的行列式是可用于确定分配给同一行中其他属性的值的任何属性。

示例:考虑一个具有employee_id、first_name、last_name 和date_of_birth 属性的表。在这种情况下,字段employee_id 确定其余三个字段。姓名字段不能确定employee_id,因为公司可能有多个员工具有相同的名字和/或姓氏。类似地,DOB 字段不能确定employee_id 或name 字段,因为可能有多个员工的生日相同。

该定义是否也适用于候选键?

4

3 回答 3

19

据我了解,如果表未完全规范化,行列式可能不是候选键。事实上,行列式这个词用于描述将非正常数据转换为更有用的规范化形式的过程。

考虑这个(显然是非正常的)表:

CREATE TABLE US_Address (
  AddressID int,
  Streetline varchar(80),
  City varchar(80),
  State char(2),
  ZIP char(5),
  StateName varchar(80),
  StateTax DECIMAL(5,2)
)

State 是 StateName 和 StateTax 的决定因素,但它不是该行的候选键。因此,适当的规范化会将 StateName 和 StateTax 从 US_Address 表中移出并移到 States 表中。

请参阅此处了解更多信息。

于 2013-05-23T06:29:55.347 回答
9

TL;DR不,“行列式”和“候选键”不是同一个概念。行列式是FD。CK 是一张桌子。我们也可以合理地说,CK 是其表的(FD)行列式,因为它决定了其中的每一列和列集。


以下所有术语/概念都是针对表值变量并行定义的。当给定业务/应用程序中可能出现的每个表值时,表变量具有 FD(功能依赖)、行列式、超键、CK(候选键)或 PK(主键)(在变量意义上)的实例有那个实例(在表格意义上)。

对于 X 和 Y 列的集合,我们可以写成X -> Y我们说 X 是行列式/决定集,Y 是函数依赖( FD ) X -> Y的确定集

我们说 X 在功能上决定Y 并且 Y在功能上由X 决定。我们说 X 是X -> Y的行列式。在 {C} -> Y 我们说 C在功能上决定Y。在 X -> {C} 我们说 X在功能上确定C。当 X 是 Y 的超集时,我们说 X -> Y is trivial

当 X 的每个子行值仅与 Y 的一个特定子行值一起出现时,我们说 X -> Y在表 T 中成立。或者我们说 X -> Y 是T的/在T中的 FD。当 X 是某个 FD 的行列式时在表 T 中,我们说 X是/在T中的行列式。表的每个平凡 FD 都包含在其中。

表 T的超键是一组在功能上确定每一列的列。候选键( CK ) 是一个不包含更小的超键的超键。我们可以选择一个 CK 作为主键( PK ),然后调用其他 CK 的备用键( AKs )。当列在某个 CK 中时,它是素数。

请注意,行列式可以是FD或粗略的(包含在其中的 FD) table每个 CK 都是其表的行列式。(但是,在一个表中,每组列都是一个行列式:本身,微不足道。同样每一列。)

(这些定义不依赖于规范化。表的 FD 和 CK 用于规范化它。当包含在其中的非平凡 FD 的每个行列式都是超级键时,表在 BCNF 中。)

SQL 表不是关系,SQL 运算符不是它们的关系/数学对应物。除其他外,SQL 具有重复行、空值和一种 3 值逻辑。但是,尽管您可以借用术语并赋予它们 SQL 含义,但您不能仅将这些含义替换为其他 RM 定义或定理并得到一些合理或真实的东西。因此,我们必须将 SQL 设计转换为关系设计,应用关系概念,然后再转换回 SQL。在某些特殊情况下,我们可以直接在 SQL 中执行某些操作,因为我们知道如果进行转换、应用和转换回会发生什么。

于 2015-12-10T00:23:09.247 回答
6
  • 主键或任何候选键也是决定因素,反之则不然。
  • 行列式可以唯一地确定行中的一个或多个属性。
  • 候选键可以唯一地确定整行。

这里举个例子,让有一个包含以下列的表:

客户编号、姓名、地址、信用、销售代表编号、销售代表姓名

假设Sales Rep #可以唯一确定Sales Rep Name. 因此,Sales Rep #是该表的决定因素,Sales Rep Name但不是该表的候选键。

于 2015-12-03T06:17:15.583 回答