2010-01-05 400 views
6

这个问题是针对MySQL的,因为这是我正在使用的 - 但我认为它可能几乎每个主要数据库实现都是相同或相似的。了解数据库中的密钥

密钥如何在数据库中工作?我的意思是,当你将一个字段设置为'主键','唯一键'或'索引'时,每个字段都做了什么,我应该什么时候使用它们?

现在我有一个包含几个字段的表,其中一个是GUID(减去{和})。我将GUID字段设置为主键,并且我看到它创建了一个二叉树。因此它可以提高搜索性能 - 但是与其他类型的密钥区别的是什么?我知道这可能不是真正的编程相关(虽然它是与开发有关的) - 我不确定究竟在哪里问这个问题,但是这是我使用最多的,所以我会在这里问。根据需要迁移

回答

11

在网络上其他地方可能有数​​百个参考文献,所以Google的一些内容将帮助您深入了解数据库设计。这就是说,基本要点是:

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

谢谢你,一个基本的了解是所有我真的找了,我只是想确保我做出了正确的决定(并能保持作出正确的决定),当我添加一键表 – 2010-01-05 19:01:44

+0

很好的回答。 FWIW,一些RDBMS允许具有唯一约束的列中有多个NULL。而你并没有包括外键。 – 2010-01-05 19:02:15

+0

比尔,因为我刚刚注意到,OP是关于MySQL(这是允许多个空值具有唯一约束的RDBMS中的一个)明确要求,我将修改我的答案...你说得对。但OP没有询问外键...... – delfuego 2010-01-05 19:05:16

0

在最基本的主键代表记录将如何物理存储在内存中/磁盘上,你会想要最独特的领域,因为它将大大减少搜索。

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

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

这些都是非常简单的答案,但我认为这是它的要义。

1

定义主键时,数据库会根据该键创建索引。它需要是独一无二的。一般来说,您可以创建一个索引来加速基于非唯一查询数据的数据访问。唯一键控数据的索引检索时间应该比非唯一键控索引更好,所以我尽可能使用唯一索引。

0

还有一件事,任何键本质上都是一个单独的表,按照索引排序,该索引直接指向与键匹配的行。 BTree风格索引存储在一棵平衡树中,平衡树是一个树形结构,其中左移越小,右移越大。

5 
3 7 
2 4 6 8 

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

0

为了真正理解按键,您必须在三个层次上理解它们:概念,逻辑和物理。我要扭转我的惯常秩序,首先讨论身体。

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

大多数有经验的程序员都对指针和地址有一个透彻的理解,并且只要它使用指针和地址就能准确理解数据结构是如何工作的。在关系数据库成为主导之前,实际上有数据库使用指向嵌入在其他记录中的记录的指针来将数据绑定在一起。

使用键而不是指针的一个缺点是DBMS必须使用索引将键引用转换回指针才能检索有问题的行。一个好处是,只要DBMS相应地更新所有相关索引,间接级别就允许DBMS无论出于何种目的都对表中的所有行进行整理。

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

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

(其实,关系和表不是同义词,但我在这里简单化。同样,元组和行不是同义词,尽管它们看起来乍看是相同的。)

的主要原因申报初级关键是排除重复的键或丢失的键。 有时,数据库人员会选择将重复和丢失键保留给应用程序写入数据库的程序员。更常见的情况是,主键约束用于将错误反映回违反主键约束的程序。

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

在概念层面,关键是通过用户社区标识实体实例的方式,这些实体是否者(员工,旅客等),东西(银行帐户,酒店客房等)或任何。密钥是数据,密钥标识的实体不是数据。因此可以将密钥视为数据库中实体的替代物。

在概念层次,按键总是自然,也不会被系统自动供给。然而,在现实世界中,钥匙往往管理不善,而管理不善的后果则被所谓的“常识”所克服。将常识灌输到自动化系统中通常是不可行的。

我从来没有真正在上述的指数,但它在我所说的隐式的。索引是一个数据结构,用于从一个键映射到一个指针。在您可能使用的所有数据库中,索引由数据库构建器(或者DBA)声明并由DBMS管理。