当前位置: 首页 > 面试题库 >

(Postgre)SQL中的一对多关系

冯敏达
2023-03-14
问题内容

我有两个表:

帖子:

 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都是文本类型。我想要的是从tag.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查询来获取以某些内容开头的标签列表,如果您在一个字段中串接了一串字符串,这将更加困难。



 类似资料:
  • Postgre-SQL 一个用于node.js上的,基于pg/pg-native/pg-pool的一个PostgreSQL数据库操作库。 设计目标是:用更少的代码,写出更直观的(复杂)查询。 比如: * await db.table(table).add(data). 在insert into 之后,自动检测是否有主键,主键是否是序列,如果是,返回ID。否则返回影响的行数。如果`table`表中有

  • 问题内容: 我有两个表A和Band,A与B之间的关系是A —>一对多—> B 通常,对于A的每条记录,我都有一个B的记录。 我正在尝试编写一个查询,该查询将为我提供A的 唯一 记录列表,其中B中的 记录 超过 一个(多个) 。 我很困惑,因为我只完成了基本的sql查询,而这对我来说似乎很复杂。 可以请一个人指导我正确答案或给我解决方案。 编辑: 好吧,我尝试了下面的事情,它给了我一个错误 从A a

  • 问题内容: 我在C#中有一个这样的对象: 假设我在SQL中有两个表,一个表定义了窗口小部件属性,另一个表为单个窗口小部件保存了许多记录,假设窗口小部件的收藏夹编号: 我发现自己经常执行两个SQL查询来填充该对象,即使我知道我可以联接表以仅创建一个查询。原因是只用我需要的数据填充对象似乎要比遍历具有大量重复数据的结果集更简单。当然,与实际情况相比,此小部件示例已大大简化。这是示例: 我的问题是我应该

  • 问题内容: 假设我有2个表,分别称为“ twitter_user”和“ twitter_comments”。 twitter_users 具有字段:用户名和生物 twitter_comments 具有字段:用户名和注释 显然,一个用户在twitter_users中有1个条目,在twitter_comments中可能有很多条目 我想在Elastic Search中同时对twitter_users和t

  • 本文向大家介绍详解sql中的参照完整性(一对一,一对多,多对多),包括了详解sql中的参照完整性(一对一,一对多,多对多)的使用技巧和注意事项,需要的朋友参考一下 一、参照完整性 参照完整性指的就是多表之间的设计,主要使用外键约束。 多表设计: 一对多、多对多、一对一设计 1.一对多 关联主要语句: constraint cus_ord_fk foreign key (customer_id) R