我有一个非常小的表格,最多有 5 条记录,其中包含一些标签。我正在使用 Postgres。
结构如下:
id - smallint 标签 - varchar(100)
该表将主要用于引用其他表中的行。问题是是否真的有必要在 id 上有一个主键,或者在 id 上只有一个索引,或者两者都有?
我确实阅读了有关索引和主键的信息,并且我知道这在很大程度上取决于表的用途:
编辑:我想问一下是否有主键或索引,或者两者都有。我编辑了这个问题。
我有一个非常小的表格,最多有 5 条记录,其中包含一些标签。我正在使用 Postgres。
结构如下:
id - smallint 标签 - varchar(100)
该表将主要用于引用其他表中的行。问题是是否真的有必要在 id 上有一个主键,或者在 id 上只有一个索引,或者两者都有?
我确实阅读了有关索引和主键的信息,并且我知道这在很大程度上取决于表的用途:
编辑:我想问一下是否有主键或索引,或者两者都有。我编辑了这个问题。
拥有主键列始终是一种好习惯。需要它的典型场景是当您想要更新或删除一行时,拥有一个 PK 会使它变得更容易和更安全。
是的,主键不仅是一种好的做法——它是至关重要的。缺少唯一键的表无法采用第一范式。
如果您希望其他表使用外键引用该表,则必须声明 PRIMARY KEY 或 UNIQUE 约束。
在大多数 RDBMS 品牌中,PRIMARY KEY 和 UNIQUE 约束都隐式地在列上创建索引。如果它没有隐式执行此操作,则可能需要您自己定义索引,然后才能声明约束。
是的,您将需要 id 字段上的主键,因为您不希望两个标签共享相同的 id。
您还需要一个索引,以加快此表中的搜索/查找过程(尽管对于小型表,性能增益较小)。该序列只会帮助您填写下一个ID;它不会阻止您将以前的值更改为已经存在的值。
创建索引而不是主键的原因很少。正如比尔卡尔文所说,你根本不会节省资源。而且,正如您可能已经猜到的那样,如果您有主键,则根本不需要创建新索引。
在某些情况下,可能很难找到关键候选人。但这似乎并非如此,它显然违背了一些良好的做法。
顺便一提。由于您的表很小,即使有索引,大多数查询也宁愿使用全表扫描。不用担心您会看到全表扫描。
从开发者的角度来看,PRIMARY KEY
只是组合NOT NULL
和UNIQUE INDEX
上列之一。
AUNIQUE INDEX
是好的,如果:
SELECT
,UPDATE
或DELETE
使用对索引字段有选择性WHERE
的条件,即受查询影响的行数远少于总行数(例如,行数)。10
2,000,000
AUNIQUE INDEX
是坏的,如果:
INSERTS
UPDATE
's 和DELETE
's 的索引值,其WHERE
条件对索引字段没有选择性,即受查询影响的行数与总行数(例如,1,500,000
行数2,000,000
)相当。鉴于您将有一张小桌子,我建议您在PRIMARY KEY
上面创建一个。