非常小的桌子上的主键

时间:2009-02-17 13:39:53

标签: database indexing primary-key

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

结构如下:

id - smallint label - varchar(100)

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

我读过关于索引和主键的内容,我明白这很大程度上取决于该表的用途:

Tables with no Primary Key

编辑:我打算询问是否有主键或索引,或者同时拥有它们。我编辑了这个问题。

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

是的,主要关键不仅是良好的做法 - 这是至关重要的。缺少唯一键的表无法在First Normal Form中。

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

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

顺便说一下。由于您的表太小,因此即使存在索引,大多数查询也会使用全表扫描。不要担心你看到全表扫描。

答案 4 :(得分:0)

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

UNIQUE INDEX 如果:

  1. 您需要强制执行唯一性。使用索引是最有效的方法。
    • 您需要在索引字段上执行SELECTUPDATEDELETE条件 selective WHERE条件,即受查询影响的行数远远少于行总数(例如102,000,000)。
  2. UNIQUE INDEX 错误如果:

    1. 当然,你不需要在这个领域有唯一性:)但你最好在表中有一个唯一的索引,以便每个记录都可以识别。
      • 您需要快速INSERTS
      • 您需要索引值的快速UPDATEDELETE以及在索引字段上无选择性WHERE条件,受查询影响的行数与行总数(例如1,500,0002,000,000)相当。
    2. 鉴于您将要有一张小桌子,我建议您在其上创建一个PRIMARY KEY