【发布时间】:2020-05-13 05:28:31
【问题描述】:
我的 PostgreSQL 数据库中有以下表格:
CREATE TABLE "User" (
id VARCHAR(25) PRIMARY KEY NOT NULL
);
CREATE TABLE "Post" (
id VARCHAR(25) PRIMARY KEY NOT NULL
);
CREATE TABLE "_PostToUser" (
"A" VARCHAR(25) NOT NULL REFERENCES "Post"(id) ON DELETE CASCADE,
"B" VARCHAR(25) NOT NULL REFERENCES "User"(id) ON DELETE CASCADE
);
User 和Post 之间的关系现在通过_PostToUser JOIN 表进行管理。
但是,我想摆脱这个额外的 JOIN 表,只需要一个从 Post 到 User 的外键引用,所以我运行了这个查询来创建外键:
ALTER TABLE "Post" ADD COLUMN "authorId" VARCHAR(25);
ALTER TABLE "Post"
ADD CONSTRAINT fk_author
FOREIGN KEY ("authorId")
REFERENCES "User"("id");
现在,我想知道需要运行什么 SQL 查询才能将数据从 JOIN 表迁移到新的 authorId 列?如果我理解正确,我需要一个查询来读取_PostToUser 关系表中的所有行以及每一行:
- 通过查找列
A中的值来查找相应的Post记录 - 将列
B中的值作为authorId的值插入到该Post记录中
编辑:正如@Nick 在 cmets 中提到的,我应该澄清我确实想将关系从 m-n 更改为 1-n:一篇帖子可以在大多数只有一位作者。一位作者/用户可以写多篇文章。
【问题讨论】:
-
我不明白。如果
_PostToUser表已经包含作者和帖子ID 值,那么为什么不能使用它呢?顺便说一句,您当前的设计已经是最优的,您不应该更改它。 -
感谢您的回复!所以,现在我需要两个 JOIN 来获取关于帖子作者的信息(加入
Post和_PostToUser并从那里加入User)。据我了解,直接在Post上包含FK 将允许我通过一个JOIN(从Post到User)获取作者信息。这有意义吗? -
很可能没有理由走这条路。为什么你认为你需要这样做?在放弃连接之前,您应该首先查看连接表,以便更快地进行查找。您的建议是非标准做法,只有在没有其他方法可以使用您当前的设计时才应该这样做。
-
哈,谢谢你的上下文。您能否推荐有关如何优化联结表中的查找的任何资源?另外,我喜欢任何能解释这是非标准做法的指针,我不是数据建模专家,但我认为将关系建模为 FK 将是常见做法,所以我很想了解更多相关信息! :)
-
您应该注意,按照您的建议更改结构意味着您将 Posts:Authors 限制为 N:1 关系;即一个帖子不能有很多作者。如果这是您对该项目生命周期的期望,那么进行此更改并不是一件不合理的事情。
标签: sql postgresql