允许一列与另一个表中的多行相关[重复]

Posted

技术标签:

【中文标题】允许一列与另一个表中的多行相关[重复]【英文标题】:Allow One Column to Relate to Multiple Rows in Another Table [duplicate] 【发布时间】:2021-11-18 13:18:12 【问题描述】:

对于一项任务,我们应该对网站进行“逆向工程”并尝试重新创建数据库结构。我只完成了一个专栏,但我不知道如何让它发挥作用。

对于这项任务,我选择“逆向工程”评价我的教授网站。我有 4 个表:用户、评论、教授和学校。在网站中,您可以保存多个教授,但这就是我遇到的问题......我不知道设置“用户”表的“saved_professors”列的数据类型。我希望它在数组中包含每个教授的 ID,但据我所知,您不能将数据类型作为数组(SET 和 ENUM 看起来很接近,但我很确定这些不会起作用我需要它的方式...)

有没有办法做到这一点?或者我应该将其设置为 VARCHAR 或 TEXT(它只会保存字符串中的 id 列表)?


注意:这不是关于存储一串 id,我已经知道该怎么做,而且我知道这不是最好的方法,这就是我专门问这个问题的原因......请不要将其标记为“与Is storing a delimited list in a database column really that bad? 重复”...这是一个很好的问题/答案,但它不能在这里回答我的问题。

【问题讨论】:

【参考方案1】:

你需要另一张桌子。

您所描述的是多对多关系。一个学生可以救很多教授,同样一个教授也可以被很多学生救。

每个多对多关系都应该作为一组存储在一个新表中:

CREATE TABLE saved_professors (
  user_id INT NOT NULL,
  professor_id INT NOT NULL,
  PRIMARY KEY (user_id, professor_id)
);

在此表的每一行中只存储一对。这意味着对于每个学生,此表中可能有很多行。

另请参阅我的回答:Is storing a delimited list in a database column really that bad?

【讨论】:

第四行到底在做什么? PRIMARY KEY (user_id, professor_id) 似乎正在将主键设置为 user_idprofessor_id... 你可以这样做吗? @JacobHornbeck 是的,你可以这样做,它被称为复合键。不要陷入制作单独键的陷阱,只需使用两个连接列 @Charlieface 好的,谢谢!我想我从来没有在进入 SQL 的课程中​​被教过…… 这意味着每个唯一的 pair 值只能有一行,但在任一列中都可以有很多行存储给定值。例如。许多行具有相同学生的 user_id,只要他们有不同的professor_id,反之亦然。

以上是关于允许一列与另一个表中的多行相关[重复]的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:交叉引用一个表中的多个列与另一个表中的多个列

Pandas Multiindex Groupby 聚合列与另一列的值

另一个表中的多行(与另一个表相关)记录的总和

如何将一个熊猫数据框的一列与另一个数据框的每一列相加?

如果任何列与另一个表中的匹配行不同,如何插入行

将一列与另一数据框列匹配并粘贴第二个数据中的值 - Python