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

时间:2015-01-05 08:45:03

标签: sql postgresql orm

我有以下表格:

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
)

这是一个连接表,它将许多Users与许多Posts与复合pk PostId,UserId相关联。我要做的是从PostId,UserId中删除唯一性,以便允许每个用户每个帖子存储多个PostView

  1. 我应该删除pk并为PostId,UserId添加索引(或先添加索引然后再删除pk)?
  2. 或者我应该添加id serial列,将其设为pk,然后删除化合物pk?

1 个答案:

答案 0 :(得分:1)

您没有解释updatedAt列目的,因此我会删除它,将createdAt重命名为viewedAt并将其作为PK的一部分:

constraint PostViews_pkey PRIMARY KEY (PostId, UserId, viewedAt)

用户在同一时间两次查看帖子的可能性微不足道。如果要提供该案例,请将客户端插入代码包装在try/catch中,并在出现PK异常时重试。

不要对标识符使用双引号。这将是一个真正的痛苦。