PostgreSQL中主键的最佳选项是什么?

PostgreSQL中主键的最佳选项是什么?,sql,postgresql,database-design,primary-key,database-schema,Sql,Postgresql,Database Design,Primary Key,Database Schema,我有一个小数据库,其中有两个表:Items和Images。在Items中,我有一个名为ItemSys的列,它是一个串行主键。我当前的图像表创建脚本如下所示: CREATE TABLE IF NOT EXISTS public.Images ( ImageSys SERIAL PRIMARY KEY, ItemSys INT NOT NULL, ImageSeq INT NOT NULL, ImageLocation VARCHAR NOT NULL UNIQUE,

我有一个小数据库,其中有两个表:Items和Images。在Items中,我有一个名为ItemSys的列,它是一个串行主键。我当前的图像表创建脚本如下所示:

CREATE TABLE IF NOT EXISTS public.Images (
    ImageSys SERIAL PRIMARY KEY,
    ItemSys INT NOT NULL,
    ImageSeq INT NOT NULL,
    ImageLocation VARCHAR NOT NULL UNIQUE,
    UNIQUE (ItemSys, ImageSeq)
);
除了给表提供一个始终具有唯一INT值的列之外,不使用ImageSys。要检索项目的所有图像,我将在联接中使用ItemSys。我当前的定义是最好的方法,还是应该删除ImageSys并在ItemSys和ImageSeq上定义主键


同样,我将只加入ItemSys而不是ImageSeq,但ImageSeq将是每个ItemSys唯一的,并将用于排序。

如果您的items表具有对图像的外键引用,则需要两个字段,而不是一个字段。因此,您将抢劫Peter来支付Paul。如果ItemSys是唯一的,那么只需声明它是主键。不必要的复合主键会影响性能,并且不必要的列ImageSys.ItemSys仅对Items表是唯一的。一个项目可以有多个映像,因此在images表中,ItemSys不是唯一的,但ItemSys和ImageSeq的组合是唯一的。修改现有记录的主键值是个坏主意更新需要级联到FKs,触发器更难编写,审核几乎不可能,而且ORM根本不能很好地处理记录的身份变化。ImageSeq听起来像是您需要更新的内容。继续使用生成的键。我还没有将模式脚本应用于生产数据库。我可以根据需要对脚本进行任何更改,而不会产生任何影响。