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

标签 mysql sql foreign-keys duplicates

仍在尝试进入数据库世界,每天都会遇到问题!

我有一张“歌曲”表,其中包含有关艺术家/轨道的信息:

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 添加到 tag_fk 中,用逗号分隔,但它每行只允许一个 SMALLINT。

我想我可以向包含“lovesong;melancholic”的“tag.tag_name”添加一个新行,然后在 php 中处理它,用“;”拆分它,但这是一个不太性感的问题解决方案,尤其是因为数据是由程序添加的,我也必须处理字符串的排序,所以我不会以重复的标签结束,比如“lovesong;melancholic”和“melancholic;lovesong”,它们基本上是一样的。

这个问题通常是如何解决的?如果我确实用 varchar 列 'songs.tag' 替换 'songs.tag_fk' 而不是我会有大量重复数据,因为数据库中会有很多“Lovesongs”和“Melancholic”歌曲,所以外键解决方案可能是最好的。

我还考虑过添加“songs.tags_fk”和“songs.tags_fk2”,但这也是一个肮脏的 hack。特别是当一些歌曲开始有超过 2、3、4 个标签时。

处理该问题的最佳方法是什么?

最佳答案

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

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

关于mysql - 在这种情况下使用外键(MySQL)是否明智?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12513675/

相关文章:

mysql - 自动增量字段加载超过10000条产品数据

php - 插入数组值取决于带条件的数据表(嵌套数组)

c# - 外键、私钥 MSSQL 1 :1 and 1:Many issues

MySQL-错误号 150 : "Foreign key constraint is incorrectly formed"

mysql - 使用 SQL 脚本在 mySQL 中找不到表

php - 如何对多个用户插入同一个表中不同位置的列表进行排序/排序?

MySQL select查询返回250K+结果,delete查询只删除一个?

sql - 使用 SQL 从一组值中查找缺失值

mysql - 如何计算在给定时间段内旅行过和前一年旅行过的用户?

mysql - 将一个外键引用到多个可能的主键