1

私は一般的にフロント エンド開発者 (HTML/CSS など) ですが、現在、挑戦のためにいくつかのバック エンド開発に取り組んでいます。私はこのバックエンドのことを数週間しか行っていないので、私の用語/ロジックはまだ初期段階にあることを覚えておいてください...簡単に行ってください;)

出発点として、ビニール コレクションをカタログ化できるように、PHP と MySQL で何かを構築しています。これは、アーティスト、タイトル、レーベルなどを受け取り、それを MySQL データベースに格納する、非常に単純な形式です。また、各レコードにタグを実装して、1 つのトラックに「House | House |」というタグを付けたいと考えています。ファンキー | 「ダブステップ | ボーカル」とタグ付けされます。MC | 低音」またはそのようなもの。

これらのタグを MySQL の配列として保存することはできないため、それらをコンマ区切りの値として挿入する必要があることを理解しています。次に、フロントエンド レベルでこれらを操作する場合は、CSV を取り出す必要があります。データベース、その値を分解し、各要素を個別のリスト要素として表示します。

その部分はわかります。しかし、追加のタグを追加するにはどうすればよいでしょうか? 私は決定的な答えを見つけることができないようです (おそらく私は間違ったものを探していますか?) しかし、これまでのところ、私が解決できるのは、データベースから「タグ」の現在のデータベース値を取得する必要があるということだけです。それを変数として格納します。データベースから「タグ」値を削除し、新しいタグを変数に追加してから、新しい変数をデータベースに保存します。

確かにもっと簡単な方法がありますか?

4

1 に答える 1

2

リレーション テーブルと外部キーの概念についてよく勉強する必要があります。次のように、タグを独自のテーブルに分割することをお勧めします。

アルバム表

album_id  album_artist    album_title
---------------------------------------------------
1         Nirvana         In Utero
2         Noisia          Split the Atom

タグ表

album_id  tag
--------------------------------------------------
1         Rock
1         Grunge
1         Alternative
2         Dubstep
2         Drum & Bass
2         Experimental

次に、GROUP CONCAT を使用してそれらをカンマ区切りのリストに結合できます。

SELECT       a.album_artist
            ,a.album_title
            ,GROUP_CONCAT(b.tag) AS tags
FROM        Album a
JOIN        Tags b
USING       (album_id)
WHERE       album_id = xxx

結果:

album_artist    album_title       tags
---------------------------------------------------
Nirvana         In Utero          Rock, Grunge, Alternative
Noisia          Split the Atom    Dubstep, Drum & Bass, Experimental

さらに、データをアーティスト テーブルに分割することもできます。このテーブルでは、album_artist 名がアーティスト テーブルのアーティスト ID に置き換えられ、タグ名が別のテーブルに分割され、タグ名が tag_ids に置き換えられます...

これはMySQLに固有のものであることに注意してくださいGROUP_CONCAT... SQL SERVER 2005以降にも同様のものがあることは確かですが、彼らがそれを何と呼んでいるのか覚えていません。またUSING (col_name)、MySQL 固有のものであり ON a.album_id = b.album_id 、結合する列が同じ名前の場合にのみ使用できる ON 句を記述する簡単な方法です。より短く、複雑なクエリを読みやすくするため、USING私はそれを好みます。ON

https://en.wikipedia.org/wiki/Database_normalization

編集 コメントごとに、タグを独自のテーブルに分割した場合は次のようになります。値の繰り返しを示すために、さらに 2 つのエントリを追加しました。Rock、Dubstep、Experimental が複数回使用されていることに注意してください。ただし、それらのテキスト値は 1 回しか表示されません...

Album table:

album_id  album_artist        album_title
---------------------------------------------------
1     Nirvana                 In Utero
2     Noisia                  Split the Atom
3     Nero                    Welcome Reality
4     Pink Floyd              The Wall

Tags table:

tag_id    tag
--------------------------------------------------
1         Rock
2         Grunge
3         Alternative
4         Dubstep
5         Drum & Bass
6         Experimental

Album_Tags table:

album_id  tag_id
--------------------------------------------------
1         1
1         2
1         3
2         4
2         5
2         6
3         4
4         1
4         6

クエリ:

SELECT       a.album_artist
            ,a.album_title
            GROUP CONCAT(c.tag) AS tags
FROM        Album a
JOIN        Tags b
USING       (album_id)
JOIN        Album_Tags c
USING       (tag_id)
WHERE       album_id = xxx
ORDER BY    album_title ASC

結果:

album_artist  album_title         tags
---------------------------------------------------
Nirvana       In Utero            Rock, Grunge, Alternative
Noisia        Split the Atom      Dubstep, Drum & Bass, Experimental
Pink Floyd    The Wall            Rock, Experimental
Nero          Welcome Reality     Dubstep
于 2013-05-06T07:17:31.833 に答える