1

我的问题是,数据库中的关系/表是否有必要具有候选键并因此具有主键?是否有可能存在无法通过任何属性组合唯一标识行的关系?

如果不是,为什么?如果是,那么 DBMS 如何使搜索、删除等操作高效?

4

3 回答 3

2

关系总是有不同的元组,这意味着在关系 DBMS 中,表总是至少有一个候选键。

SQL 是另一种情况。SQL 表是“元组包”,而不是关系。SQL 表可以有重复的行,这是 SQL 最大的缺陷之一。尽管 SQL 支持重复行,但该语言并不适合处理它们。在存在重复行的情况下,例如 SQL 标准 UPDATE 和 DELETE 无法保证在不借助一些复杂的基于游标的操作的情况下引用单个行。

重复行的后续问题是 SQL DBMS 的某些低效率和复杂性以及它们的功能缺乏正交性。SQL DBMS 引擎必须使用内部结构并支持特殊功能作为先决条件才能处理重复行。一些 DBMS 供应商试图通过禁用没有键的表的某些功能来解决这些问题。

于 2015-09-21T08:40:19.690 回答
0

是的,这是可能的。

请注意,幕后确实存在一些标识符(来自 SQL Server 的示例):

当表存储为堆时,各个行通过引用由文件号、数据页号和页上的槽组成的行标识符 (RID) 来标识

将如何进行操作?

几乎所有操作都需要进行表扫描:

如果表是堆并且没有任何非聚集索引,则必须检查整个表(表扫描)以找到任何行

于 2015-09-19T11:54:51.403 回答
0

数据库不需要主键。表只是一组无序的行。如果没有任何索引,访问表中行的唯一机制是全表扫描(或全分区扫描,如果表是分区的)。此类操作仅对非常少量的行有效。

当您可以引用特定行时,表格会更有用。通常,最好的主键是自动递增/标识主键。这些由数据库维护。实际上,设计良好的数据库中的所有表都将具有主键。以下是三个原因:

  • 行可以被其他表引用。
  • 可以更新和删除各个行。
  • 可以有效且明确地选择各个行。

注意:您可以在没有主键的表上创建索引。并且一个或多个列的组合可以是唯一的,即使该组合不是主键。主键本身就是一个索引,所以反之不成立。并且表中的所有行都有唯一的“行地址”。这些是否可用于查询取决于数据库引擎。

于 2015-09-19T11:32:06.177 回答