仍在尝试进入数据库世界,每天都会遇到问题!
我有一张“歌曲”表,其中包含有关艺术家/曲目的信息:
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';
现在我有一个外键在“songs”中引用“tags.tag-id”,“tags.tag-name”稍后将包含“lovesong”,“melancholic”等标记。现在在某些情况下,一首歌可以有多个标签,所以如果它是一首忧郁的情歌,它应该有两个标签。虽然我刚刚注意到我不能将两个SMALLINT添加到用逗号分隔的标记fk中,但它只允许每行一个SMALLINT。
我想我可以在包含“lovesong;melancholic”的“tag.tag_name”中添加一个新行,然后用php处理它,并用“;”分隔它,但这并不是一个很好的解决问题的方法,特别是因为数据是由程序添加的,我还需要处理字符串的排序,所以我不会用重复的标签,比如“情歌;忧郁”和“忧郁;情歌”,基本上是一样的。
这个问题通常是如何解决的?如果我用varchar列“songs.tag”代替“songs.tag”,我会有大量重复数据,因为数据库中会有很多“情歌”和“忧郁”歌曲,所以外键解决方案可能是最好的。
我还考虑过添加“songs.tags”和“songs.tags”这两个词,但这也是一个相当肮脏的技巧。尤其是当一些歌曲开始有超过2,3,4个标签。
最好的办法是什么?
最佳答案
听起来像是一种多对多的关系。您需要第三个表来链接这两个表。这样一首歌可以有多个标记,一个标记可以分配给多首歌。
http://www.phpknowhow.com/mysql/many-to-many-relationships/
关于mysql - 在这种情况下使用外键(MySQL)是否明智?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12513675/