允许一列与另一个表中的多行相关[重复]
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_id
和 professor_id
... 你可以这样做吗?
@JacobHornbeck 是的,你可以这样做,它被称为复合键。不要陷入制作单独键的陷阱,只需使用两个连接列
@Charlieface 好的,谢谢!我想我从来没有在进入 SQL 的课程中被教过……
这意味着每个唯一的 pair 值只能有一行,但在任一列中都可以有很多行存储给定值。例如。许多行具有相同学生的 user_id,只要他们有不同的professor_id,反之亦然。以上是关于允许一列与另一个表中的多行相关[重复]的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server:交叉引用一个表中的多个列与另一个表中的多个列