【问题标题】:primary key on very small table非常小的表上的主键
【发布时间】:2010-10-08 02:16:35
【问题描述】:

我有一个非常小的表,最多有 5 条记录,其中包含一些标签。我正在使用 Postgres。

结构如下:

id - smallint 标签 - varchar(100)

该表将主要用于引用其他表中的行。问题是是否真的有必要在 id 上有一个主键,或者只在 id 上有一个索引,或者两者都有?

我确实阅读了有关索引和主键的信息,并且我知道这在很大程度上取决于表的用途:

Tables with no Primary Key

编辑:我要问的是有一个主键或一个索引,或者两者都有。我编辑了问题。

【问题讨论】:

    标签: database indexing primary-key


    【解决方案1】:

    拥有一个主键列始终是一个好习惯。需要它的典型场景是当您想要更新或删除一行时,拥有 PK 会更容易和更安全。

    【讨论】:

      【解决方案2】:

      是的,主键不仅是一种好习惯,而且至关重要。缺少唯一键的表不在First Normal Form 中。

      如果您希望其他表使用外键引用该表,则必须声明 PRIMARY KEY 或 UNIQUE 约束。

      在大多数 RDBMS 品牌中,PRIMARY KEY 和 UNIQUE 约束都隐式地在列上创建索引。如果它没有隐式执行此操作,则可能需要您自己定义索引,然后才能声明约束。

      【讨论】:

        【解决方案3】:

        是的,您需要在 id 字段上设置一个主键,因为您不希望两个标签共享相同的 id。

        您还需要一个索引,以加快在此表中的搜索/查找过程(尽管对于小型表,性能提升较少)。该序列只会帮助您填写下一个ID;它不会阻止您将以前的值更改为已经存在的值。

        【讨论】:

        • 在 5 行表上 - 整个事情都在内存中,优化器可能只是进行顺序扫描;在查询处理期间索引将是开销。但是您仍然希望强制执行唯一性。
        【解决方案4】:

        创建索引而不是主键的原因很少。正如比尔卡尔文所说,你根本不会节省资源。而且,您可能已经猜到了,如果您有主键,则根本不需要创建新索引。

        在某些情况下,可能很难找到关键候选人。但情况似乎并非如此,而且显然违背了一些良好做法。

        顺便说一句。由于您的表很小,即使有索引,大多数查询也宁愿使用全表扫描。不用担心您会看到全表扫描。

        【讨论】:

          【解决方案5】:

          从开发人员的角度来看,PRIMARY KEY 只是其中一个列上的NOT NULL 和UNIQUE INDEX 的组合。

          UNIQUE INDEX 是好如果:

          1. 您需要强制执行唯一性。使用索引是最有效的方法。
            • 您需要执行SELECT、UPDATE 或DELETE,并在索引字段上选择性 使用WHERE 条件,即受查询影响的行数为远少于总行数(例如,2,000,000 的行数为10)。

          如果:

          ,UNIQUE INDEX 是不好的:
          1. 当然,您不需要此字段的唯一性:) 但是您最好在表中拥有一个唯一索引,以便每条记录都可识别。
            • 你需要快速INSERTS
            • 您需要快速的UPDATE's 和DELETE's 索引值与WHERE 条件在索引字段上非选择性,即受以下因素影响的行数查询与总行数相当(例如,2,000,000 的行数为1,500,000)。

          鉴于您将有一张小桌子,我建议您在上面创建一个PRIMARY KEY。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-11-22
            • 1970-01-01
            • 1970-01-01
            • 2013-08-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多