首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在这种情况下使用外键(MySQL)是否明智?

在这种情况下使用外键(MySQL)是否明智?
EN

Stack Overflow用户
提问于 2012-09-20 21:28:18
回答 2查看 91关注 0票数 1

仍然在尝试开始数据库的世界,每天都会遇到问题!

我有一个‘歌曲’表,其中包含艺术家/曲目的信息:

代码语言:javascript
复制
CREATE TABLE songs (
    song_id INT AUTO_INCREMENT PRIMARY KEY, 
    artist_name varchar(100) DEFAULT NULL,
    song_name varchar(100) DEFAULT NULL,
    tag_fk SMALLINT,
    FOREIGN KEY (tag_fk) REFERENCES tags(tag_id) ON DELETE SET NULL ON UPDATE CASCADE,
) ENGINE = 'InnoDB';

CREATE TABLE tags (
    tag_id SMALLINT AUTO_INCREMENT PRIMARY KEY,
    tag_name varchar(255) UNIQUE
) ENGINE = 'InnoDB';

现在我在“歌曲”中有了一个外键,它引用了“tags.tag_id”,“tags.tag_name”稍后将包含像“lovesong”,“melancholic”这样的标签。现在在某些情况下,一首歌可以有不止一个标签,所以如果它是一首忧郁的情歌,它应该有两个标签。虽然我刚刚注意到我不能向tag_fk添加两个用逗号分隔的SMALLINT,但它只允许每行有一个SMALLINT。

我想我可以在'tag.tag_name‘中添加一个新的行,包含’lovesong;duplicate‘,然后在php中处理它,把它拆分成';',但对于这个问题来说,这是一个不那么吸引人的解决方案,特别是因为数据是由程序添加的,我还必须对字符串进行排序,这样我就不会得到重复的标签,比如’lovesong;duplicate‘和’basically;lovesong‘,这两个标签基本上是一样的。

这个问题通常是如何解决的?如果我把'songs.tag_fk‘替换成一个varchar列'songs.tag’,我会有大量的重复数据,因为在数据库中会有很多“Lovesong”和“忧郁”的歌曲,所以一个外键解决方案可能是最好的。

我也考虑添加'songs.tags_fk‘和'songs.tags_fk2’,但那也是一个相当卑劣的技巧。尤其是如果一些歌曲开始具有多于2、3、4个标签。

解决这个问题的最好方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-20 21:32:28

听起来像是多对多的关系。您需要第三个表来链接这两个表。因此一首歌曲可以有多个标签,一个标签可以分配给多首歌曲。

http://www.phpknowhow.com/mysql/many-to-many-relationships/

票数 2
EN

Stack Overflow用户

发布于 2012-09-20 21:36:41

你想要的是一个多对多的表关系。为此,您可以创建第三个表,其中包含用于song_id和tag_id的外键。

代码语言:javascript
复制
CREATE TABLE Song_Tag_Xref (
    FOREIGN KEY (tag_id) REFERENCES tags(tag_id),
    FOREIGN KEY (song_id) REFERENCES songs(song_id),
) ENGINE = 'InnoDB';

然后,您可以通过如下操作获取一首歌曲的所有标签:

代码语言:javascript
复制
select tags.tag_name 
from songs, song_tag_xref, tags 
where songs.song_id = song_tag_xref.song_id 
and song_tag_xref.tag_id = tags.tag_id
and songs.artist_name like 'Bob Marley'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12513675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档