如何替换表中的复合主键?
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
。
- 我应该删除 pk 并为
PostId,UserId
添加索引(还是先添加索引然后删除 pk)?
- 或者我应该添加
id serial
列,使其成为 pk 然后删除复合 pk 吗?
您没有解释 updatedAt
列的用途,所以我将其删除,将 createdAt
重命名为 viewedAt
并使其成为 PK 的一部分:
constraint PostViews_pkey PRIMARY KEY (PostId, UserId, viewedAt)
用户同时查看 post 两次的机会很小。如果您想提供这种情况,则将客户端插入代码包装在 try/catch
中,并在出现 PK 异常时重试。
不要对标识符使用双引号。这将是永远的痛苦。
我关注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
。
- 我应该删除 pk 并为
PostId,UserId
添加索引(还是先添加索引然后删除 pk)? - 或者我应该添加
id serial
列,使其成为 pk 然后删除复合 pk 吗?
您没有解释 updatedAt
列的用途,所以我将其删除,将 createdAt
重命名为 viewedAt
并使其成为 PK 的一部分:
constraint PostViews_pkey PRIMARY KEY (PostId, UserId, viewedAt)
用户同时查看 post 两次的机会很小。如果您想提供这种情况,则将客户端插入代码包装在 try/catch
中,并在出现 PK 异常时重试。
不要对标识符使用双引号。这将是永远的痛苦。