gpt4 book ai didi

sql - (Postgresql 中的一对多关系

转载 作者:行者123 更新时间:2023-11-29 11:20:28 31 4
gpt4 key购买 nike

我有两个表:

帖子:

 id | ... other stuff ... |     tags                         
----+---------------------+--------------
1 | ... | <foo><bar>
2 | ... | <foo><baz><blah>
3 | ... | <bar><blah><goo>

和标签:

     tag         
--------------
<foo>
<bar>
<baz>
<blah>
<goo>

posts.tags 和 tags.tag 都是文本类型。我想要的是从 tags.tag 到帖子中的行的关系,以便查询 <foo>会给我对应于帖子 1 和 2 的行,查询 <blah>给我 2 和 3,<bar>给我 1 和 3,等等。

我看过外键,但我不确定这是否是我想要的。 (老实说,我不太确定它的作用)。据我所知,外键必须等于表的主键/唯一列。但我想要的是所有行 posts.tags ~ '.*<foo>.*'等。我还希望能够获取所有以 b 开头的标签,例如:

CREATE VIEW startswithB AS
SELECT tag
FROM tags
WHERE tag ~ '<b.*>';

SELECT DISTINCT * FROM posts, startswithB WHERE posts.tags ~ ('.*' || startswithB || '.*');

如何获得我正在寻找的关系?可能吗?

编辑:

好的,我做了什么:

创建 post_tags:

SELECT posts.id, tags.tag 
INTO post_tags
FROM posts, tags
WHERE posts.tags ~ ('.*' || tags.tag || '.*');

选择标签为<foo>的所有帖子:

SELECT *
FROM posts
WHERE posts.id IN (
SELECT id
FROM post_tags
WHERE tag = '<foo>'
);

最佳答案

这里实际发生的是多对多关系。想一想:每个标签可以在多个帖子上,每个帖子可以有多个标签。

正确的关系架构是在中间添加另一个表,如下所示:

CREATE TABLE post_tags (
id INTEGER REFERENCES posts,
tag VARCHAR REFERENCES tags
);

然后将 tags 列拖放到您的帖子表中。

这解决了您所有的问题,因为您可以通过在不同方向加入 post_tags 来获取帖子上的标签集或具有给定标签的帖子集。您还可以使用常规 LIKE 查询获取以某些内容开头的标签列表,如果您在一个字段中连接了一堆字符串,这将更加困难。

关于sql - (Postgresql 中的一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9606843/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com