1

まだデータベースの世界を始めようとしていて、毎日問題が発生しています!

アーティスト/トラックに関する情報を含む「曲」テーブルがあります。

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 つ以上のタグが付いている場合は特にそうです。

それに対処する最善の方法は何ですか?

4

2 に答える 2

2

多対多の関係のように聞こえます。2 つをリンクするには、3 つ目のテーブルが必要です。1 つの曲に多くのタグを付けることができ、1 つのタグを多くの曲に割り当てることができます。

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

于 2012-09-20T13:32:28.217 に答える
1

必要なのは、多対多のテーブル関係です。これを行うには、song_id と tag_id の外部キーを持つ 3 番目のテーブルを作成します。

CREATE TABLE Song_Tag_Xref (
    FOREIGN KEY (tag_id) REFERENCES tags(tag_id),
    FOREIGN KEY (song_id) REFERENCES songs(song_id),
) ENGINE = 'InnoDB';

次に、次のようにして、曲のすべてのタグを取得できます。

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'
于 2012-09-20T13:36:40.860 に答える