如何替换表中的复合主键?

How to replace compound primary key in table?

我关注table:

CREATE TABLE "PostViews"
(
  "createdAt" timestamp with time zone NOT NULL,
  "updatedAt" timestamp with time zone NOT NULL,
  "PostId" integer NOT NULL,
  "UserId" integer NOT NULL,
  CONSTRAINT "PostViews_pkey" PRIMARY KEY ("PostId", "UserId"),
  CONSTRAINT "PostViews_PostId_fkey" FOREIGN KEY ("PostId")
      REFERENCES "Posts" (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT "PostViews_UserId_fkey" FOREIGN KEY ("UserId")
      REFERENCES "Users" (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE
)

它是通过 table 连接许多 Users 到许多 Posts 与复合 pk PostId,UserId。我要做的是从 PostId,UserId 中删除唯一性,以便允许每个用户每个 post 存储多个 PostView

  1. 我应该删除 pk 并为 PostId,UserId 添加索引(还是先添加索引然后删除 pk)?
  2. 或者我应该添加 id serial 列,使其成为 pk 然后删除复合 pk 吗?

您没有解释 updatedAt 列的用途,所以我将其删除,将 createdAt 重命名为 viewedAt 并使其成为 PK 的一部分:

constraint PostViews_pkey PRIMARY KEY (PostId, UserId, viewedAt)

用户同时查看 post 两次的机会很小。如果您想提供这种情况,则将客户端插入代码包装在 try/catch 中,并在出现 PK 异常时重试。

不要对标识符使用双引号。这将是永远的痛苦。