2

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

结构如下:

id - smallint 标签 - varchar(100)

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

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

没有主键的表

编辑:我想问一下是否有主键或索引,或者两者都有。我编辑了这个问题。

4

5 回答 5

4

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

于 2009-02-17T13:42:33.737 回答
2

是的,主键不仅是一种好的做法——它是至关重要的。缺少唯一键的表无法采用第一范式

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

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

于 2009-02-17T13:56:11.070 回答
1

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

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

于 2009-02-17T13:43:36.730 回答
0

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

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

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

于 2009-02-17T14:12:26.083 回答
0

从开发者的角度来看,PRIMARY KEY只是组合NOT NULLUNIQUE INDEX上列之一。

AUNIQUE INDEX好的,如果:

  1. 您需要强制执行唯一性。使用索引是最有效的方法。
    • 您需要执行 a SELECTUPDATEDELETE使用对索引字段有选择性WHERE的条件,即受查询影响的行数远少于总行数(例如,行数)。102,000,000

AUNIQUE INDEX坏的,如果:

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

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

于 2009-02-17T14:13:11.980 回答