【问题标题】:Minimum number of candidate keys for a relation?关系的最小候选键数?
【发布时间】:2015-09-19 11:25:01
【问题描述】:

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

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

【问题讨论】:

  • Gordon 编辑了原始问题并添加了 SQL 标记。我认为这是不合理的,并且引起了一些可能具有误导性的答案(包括我在下面的答案)。 Aditya 没有具体说明他的问题与 SQL 有关。我已经删除了 SQL 标记。

标签: database primary-key rdbms candidate-key


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      是的,这是可能的。

      请注意,幕后确实存在一些标识符 (Example from SQL Server):

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

      将如何执行操作?

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

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

      【讨论】:

        猜你喜欢
        • 2017-04-27
        • 2014-02-09
        • 2012-01-04
        • 2013-10-29
        • 1970-01-01
        • 2011-10-20
        • 1970-01-01
        • 1970-01-01
        • 2021-09-10
        相关资源
        最近更新 更多