タグ付きの記事を作る
ブログのシステムを作っていたら「記事にタグを付けれるようにしてくれ」と言われたんですよ~。
仕方ないので最初は以下のように素直にテーブルを作りました。
article
id | subject | body |
---|---|---|
1 | 題名1 | 本文1 |
2 | 題名2 | 本文2 |
tag
id | name |
---|---|
1 | HTML |
2 | CSS |
3 | JavaScript |
article_tag
article_id | tag_id |
---|---|
1 | 1 |
1 | 3 |
2 | 2 |
これでidが1の記事はHTMLとJavaScriptのタグを持ち、idが2の記事はCSSのタグを持つ、という感じですね。
MySQLのSET型でテーブルをひとつにまとめる
しかし運用してゆくうちに、タグは決め打ちで名称が変わることがない、ということが分かってきたので、面倒になってテーブルをひとつにまとめてしまいました。
article
id | subject | body | tags |
---|---|---|---|
1 | 題名1 | 本文1 | HTML,JavaScript |
2 | 題名2 | 本文2 | CSS |
tagsカラムは文字列型ではなく、以下のような定義のSET型です。
SET('HTML', 'CSS', 'JavaScript')
ひとつのカラムに複数の文字列の組み合わせを持つことが出来ます。
挿入は見たまま、文字列をカンマで繋いで行います。
INSERT INTO article(tags) VALUES('HTML,CSS')
検索は、例えばHTMLというタグがある記事を探すには
SELECT * FROM article WHERE tags LIKE '%HTML%'
もしくは、
SELECT * FROM article WHERE FIND_IN_SET('HTML', tags) > 0
です。
おわりに
拡張性や汎用性(MySQL限定なので)は低くなりますが、小規模な場合は使ってみるとスッキリする場合があるかも知れない、と思います。