了解数据库中的键

时间:2010-01-05 18:40:39

标签: mysql database-design

这个问题面向MySQL,因为我正在使用它 - 但我认为几乎每个主要的数据库实现都可能相同或类似。

密钥如何在数据库中运行?我的意思是,当你将一个字段设置为“主键”,“唯一键”或“索引”时 - 每个字段的作用是什么,我何时应该使用每个字符?

现在我有一个包含几个字段的表,其中一个是GUID(减去它周围的{和})。我将GUID字段设置为主键,我看到它创建了一个二叉树。因此,它提高了搜索性能 - 但是与其他类型的密钥有何不同?

我意识到这可能与编程无关(尽管它与开发有关) - 我不确定究竟要问这个问题但是我最常用的是所以我会问这里。必要时迁移

5 个答案:

答案 0 :(得分:11)

网上其他地方可能有数​​百个引用,所以谷歌搜索将帮助您深入了解数据库设计。也就是说,基本要点是:

  • 主键:字段或字段组合,每行必须唯一,并且被索引以提供给定键值的行的快速查找;不能包含NULL,并且一个表只能有一个主键。通常在聚簇索引中索引,这意味着表中的数据被重新排序以匹配索引的顺序,这一过程极大地改进了串行数据检索。 (这是一个表只能有一个主键的主要原因 - 数据的顺序与多个索引的顺序不匹配!)
  • 唯一键:与主键相同,但在某些数据库平台上,只要不违反唯一性约束,就可以包含NULL值。 (换句话说,如果唯一键包含单个列,则表中只能有一行在该列中包含NULL;如果该键包含多个列,则该表只能包含列中包含NULL的行这样,密钥中的列就没有非唯一的NULL值重复。)在其他平台(包括MySQL)上,唯一约束可以包含多个NULL;唯一性约束仅适用于引用列的非NULL 值。每张桌子可以有多个。索引在非聚集索引中。
  • index:为预先编制索引的字段或字段组合,以便在给定索引中的字段值的情况下进行更快速的检索。一个表可以有多个索引。

答案 1 :(得分:1)

定义主键时,数据库会根据该键创建索引。它必须是独一无二的。通常,您可以创建一个索引,以加速基于非唯一查询数据的数据访问。唯一键控数据的索引检索时间应该优于非唯一键控索引,因此我尝试尽可能使用唯一索引。

答案 2 :(得分:0)

在最基本的情况下,主键表示记录将如何物理存储在内存/磁盘上,您希望您最常搜索的唯一字段是这样,因为它会大大减少搜索。< / p>

唯一键是只能包含唯一值的字段。

索引是查询可以引用的数据库文件的专用“映射”。

这些是非常简化的答案,但我认为这是它的要点。

答案 3 :(得分:0)

还有一件事,任何键本质上都是一个单独的表,它按索引排序,直接指向与键匹配的行。 BTree样式索引存储在平衡树中,平衡树是树结构,其中左行进较小并且行进右较大。

    5
 3    7
2 4  6 8

将是平衡树的一个例​​子。另一个主要类型是Hash,其中数学表达式将键转换为键的相对内存位置。

答案 4 :(得分:0)

为了真正理解密钥,您必须在三个层面理解它们:概念,逻辑和物理。我将改变我的习惯秩序,并先讨论身体。

大多数程序员倾向于在物理层面思考。在物理层面,密钥是行的地址的代理(替代)。当要引用行时,可以使用该键的副本来指定该行。当在另一行中引用对行的引用时,该副本称为外键。

大多数有经验的程序员都对指针和地址有了全面的了解,如果只使用了指针和地址,他们就能准确理解数据结构是如何工作的。在关系数据库占主导地位之前,事实上数据库使用指向其他记录中嵌入的记录的指针来将数据绑定在一起。

使用键而不是指针的缺点是DBMS必须使用索引将键引用转换回指针以便检索有问题的行。一个优点是,只要DBMS相应地更新所有相关索引,间接级别允许DBMS为了任何目的而混洗表中的所有行。

在此级别查看,键也可以是简单,整数和自动增量。这些工作比其他类型的密钥更快,并且它们可以避免在用户提供的数据丢失或不一致时出现的某些数据管理问题。但是,在这个级别上回避数据管理问题可以在两个更高的层次上创建一个雷区。

在逻辑级别,键是元组(行)中数据的最小子集,允许指定单个匹配元组,并且当DBMS检索该元组的容器时,元组中的所有属性现在可用了。每个关系至少有一个候选键。在最坏的情况下,整个元组是唯一的候选键。当单个关系(表)存在多个候选键时,通常的做法是选择一个候选键作为主键,并通过该主键进行所有引用。

(实际上,关系和表格不是同义词,但我在这里进行了简化。同样,元组和行不是同义词,尽管它们看起来很相似。)

声明主键的主要原因是排除重复键或缺少键。 有时,数据库人员会选择将重复和丢失密钥避免留给应用程序写入数据库的程序员。更常见的是,主键约束用于将错误反映回违反主键约束的程序。

当DBMS设置主键约束时,它还会在主键上构建索引。这允许DBMS快速查找重复项,并且还可以加速使用键列的某些查询。

在概念层面,密钥是用户社区识别实体实例的手段,无论这些实体是人(员工,旅行者等),事物(银行账户,酒店房间等)还是其他。关键是数据,密钥识别的实体不是数据。因此,密钥可以被视为数据库中实体的代理。

在概念层面,键始终是自然的,并且永远不会由系统自动提供。然而,在现实世界中,密钥往往管理不善,管理不善的后果被所谓的“常识”所克服。将常识灌输到自动化系统通常是不可行的。

我从未在上面描述过一个索引,但它隐含在我所说的内容中。索引是用于从键映射到指针的数据结构。在您可能使用的所有数据库中,索引由数据库构建器(或可能是DBA)声明并由DBMS管理。