我有一个非常小的表,最多有5个记录,包含一些标签。我正在使用Postgres。
结构如下:
id - smallint label - varchar(100)
该表主要用于引用其他表中的行。问题是,是否真的有必要在id上有一个主键,或者只是在id上有一个索引或者同时拥有它们?
我读过关于索引和主键的内容,我明白这很大程度上取决于该表的用途:
编辑:我打算询问是否有主键或索引,或者同时拥有它们。我编辑了这个问题。
答案 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 NULL
和UNIQUE INDEX
的组合。
UNIQUE INDEX
好如果:
SELECT
,UPDATE
或DELETE
条件 selective WHERE
条件,即受查询影响的行数远远少于行总数(例如10
行2,000,000
)。 UNIQUE INDEX
错误如果:
INSERTS
UPDATE
和DELETE
以及在索引字段上无选择性的WHERE
条件,受查询影响的行数与行总数(例如1,500,000
行2,000,000
)相当。鉴于您将要有一张小桌子,我建议您在其上创建一个PRIMARY KEY
。