SQL中基数(cardinality)的定义是什么?

30

我的学校教材数据库系统对基数的定义如下:

一个关系的基数是它包含的元组数量。相比之下,元组的数量称为关系的势,随着元组的添加或删除而改变。高基数 - 许多元组,低基数 - 少量元组。

然而,维基百科关于基数(SQL语句)的文章则将其定义为:

基数是指数据库表中某一列(属性)中包含的数据值的唯一性。基数越低,列中重复元素越多。基数有三种类型:高基数、正常基数和低基数。

它们可能都是正确的,但我无法将这两个定义联系起来作为相关定义。如果能重新表述一下就更好了!


1
基数是唯一值/记录数量的数量。我认为这本书简化了这个问题。最大基数为1。 - Mihai
这个回答解决了你的问题吗?什么是数据库中的基数? - Wai Ha Lee
4个回答

39

他们所说的内容相同,与元组(关系代数)或行(通俗术语)有关。

当它说高基数是特定属性(或字段)的可能值,这些值是唯一的,因此行或元组的数量更多:

示例

 StudentID   Lastname Firstname  Gender
 101         Smith    John       M
 102         Jones    James      M
 103         Mayo     Ann        F
 104         Jones    George     M
 105         Smith    Suse       F

StudentID而言,它的基数高的,因为它是唯一的。在这个关系中它有五个(5)元组/行。

另一方面,Lastname具有正常的基数,特别的,它只有三个(3)唯一的元组/行。因此它具有正常的基数

最后,Gender只有两种可能的唯一元组,因此低基数

你可能会将这里的基数与关系的度数混淆,因为度数与关系(或表)中的属性/字段数量有关。

另一方面,在《数据库》教材中讲到基数时,通常涉及一个实体与另一个实体之间的关系,即参与给定关系类型的实体可能出现的关系次数的数量。因此,例如对于二元关系基数可以是一对一一对多多对多


关于 Lastname 列,你的意思不是只有(3)个不同的行吗?https://learnsql.com/blog/unique-vs-distinct/ - Shawn Eary
1
@ShawnEary 是的,三(3)个不同的行。 - Edper

5
两个定义都试图表达基数是“行数”的概念,区别在于比较是“在表中”还是“在特定列中”。
你的数据库教材版本侧重于关系代数和表格结构(俚语中的“关系”)。
维基百科条目更加实用。它包含了教科书的定义,假设表格有一个主键(主键的基数与表格相同)。然而,它也可以应用于标志列。如果标志只有两个值(01),那么我们可以说该列的基数为2。
这对于优化查询非常重要。基数是选择最佳方法来连接、聚合和选择数据的一个组成部分。在实践中,大多数数据库使用的不仅仅是基数,还有关于列及其值的所谓“统计信息”来进行优化。

2
有两个概念:
  1. 索引基数
  2. 基数
我认为这里提到的是索引基数,与"基数"不同。 (详情请见此链接)
  • 索引基数是指索引中唯一值的数量。
  • 该术语用于讨论创建索引、表扫描、索引访问与表访问、其如何影响插入、更新和删除、存储空间等。
以下是另一个例子:(详情请见此链接)
  • 在 SQL(结构化查询语言)中,基数一词是指数据库表格特定列(属性)中包含的数据值的唯一性。
  • 基数越低,列中重复元素就越多。 因此,基数最低的列将对每一行具有相同的值。SQL 数据库使用基数来帮助确定给定查询的最佳查询计划。
仅仅单独使用“基数”一词,我认为它着重于表之间的关系, 特别地,它不是用于讨论单个表或数据的唯一性。
IBM 文档(如果您搜索唯一单词,则不会提到它):(详情请见此链接) 解释基数时,必须考虑显示在关系两端的符号。可能的末端标签如下列表所示:
  • 0..1(零或一个匹配)
  • 1..1(恰好一个匹配)
  • 0..n(零个或多个匹配)
  • 1..n(一个或多个匹配)
在数学中,集合的基数是“集合元素数量”的度量。 (详情请见此链接) 在数据库设计中,一个数据方面相对于另一个数据方面的基本原则或基数是一个关键特征。一个方面与另一个方面的关系必须精确而准确地联系在一起,以解释每个方面如何链接在一起。在关系模型中,表可以作为“一对多”,“多对多”,“一对零或一”等任何形式进行相关联。这被称为给定表格相对于另一个表格的基数。参考链接:https://zh.wikipedia.org/wiki/基数

0
如果我们有A和B两个表,那么基数可以被看作是表B中与表A的一行相关联的行数。如果这两个表是PERSON和VEHICLE,并且它们之间的关系是RODE_ON,那么基数就很高,因为大多数人在过去骑过许多不同的车,而大多数车也曾载过很多人。如果它们之间的关系是OWNS,那么基数就很低——大多数人只拥有一辆车,有些人则没有,而一辆车通常只有一到两个所有者,不会更多。
请注意,一个关系的一侧的基数并不等于另一侧的基数。如果这两个表是PERSON和FINGER,并且它们之间的关系是BELONG TO,那么一个人有很多手指,但每个手指只属于一个人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接