まだデータベースの世界を始めようとしていて、毎日問題が発生しています!
アーティスト/トラックに関する情報を含む「曲」テーブルがあります。
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」を参照する「songs」に外部キーができました。「tags.tag_name」には、後で「lovesong」、「melancholic」などのタグが含まれます。場合によっては、曲に複数のタグを付けることができるため、メランコリックなラブソングの場合は両方のタグを付ける必要があります。コンマで区切られた tag_fk に 2 つの SMALLINT を追加できないことに気付きましたが、行ごとに 1 つの SMALLINT しか許可されません。
「lovesong;melancholic」を含む「tag.tag_name」に新しい行を追加し、後でそれを「;」で分割して php で処理できると考えましたが、特にデータがプログラムによって追加され、文字列の並べ替えも処理する必要があるため、基本的に同じである「lovesong;melancholic」と「melancholic;lovesong」のようなタグが重複することはありません。
その問題は一般的にどのように解決されますか? 「songs.tag_fk」を varchar カラム「songs.tag」で置き換えると、データベースには「Lovesongs」と「Melancholic」の曲がたくさんあるため、大量の重複データが作成されるため、外部キー解決策はおそらく最善です。
'songs.tags_fk' と 'songs.tags_fk2' を追加することも考えましたが、これも汚いハックです。特に、一部の曲に 2 つ、3 つ、4 つ以上のタグが付いている場合は特にそうです。
それに対処する最善の方法は何ですか?