ブログなどでも「タグ機能」って便利ですよね。カテゴライズとはまた違うタグ機能をMySQLを使って設計する時に、どのように実装するかを検討してみました。
パターンとしては主に3つの方法が主流なようです。
もちろん扱う情報の内容や量によっても設計は大きく変わってきますので、データに合った設計を心がけたいですね!
MySQLで「タグ機能」を実装する
各種サービスで応用可能な「タグ機能」を実装する際にデータベースの設計方法の種類です。
1.テーブル一つで実現する
id | contents | tags |
---|---|---|
1524 | Night Ware | パジャマ 洋服 |
1525 | Town | 街 ビル 風景 |
tagsの中に全てのタグを改行しながら詰め込む方法です。
テーブルが一つで済んで、タグ検索クエリーも単純化できるメリットの反面、
パフォーマンスを考慮するとタグ検索に全文検索が必要になる。
少ないデータ量の時に活用される方法。
2.テーブル2つで実現する
table1
id | contents |
---|---|
1524 | Night Ware |
1525 | Town |
table2
id | tag |
---|---|
1524 | パジャマ |
1524 | 洋服 |
1525 | 街 |
1525 | ビル |
1525 | 風景 |
tagのテーブルを分離した方法です。
IDに対して付けられたタグごとに格納していくのでインデックスの活用も効きます。
小規模から中規模まで幅広くカバーできる設計だと言えます。
3.テーブル3つで実現する
table1
id | contents |
---|---|
1524 | Night Ware |
1525 | Town |
table2
id | tag |
---|---|
1524 | tag_id_AAA |
1525 | tag_id_BBB |
table3
tag_id | name |
---|---|
AAA | パジャマ |
BBB | 街 |
tag割り振りテーブルを噛ませる方法です。
例えば「存在するタグ一覧」の表示をする時でも簡単です。
また、タグの名前が変わった時でも一箇所の変更だけでメンテナンスは終了です。
table2を拡張すればbookmarkへの関連付けも容易になり、将来性も視野に入れれば最も効率的な設計かもしれません。
まとめ
MySQLだけでなくデータベースの設計は最初が結構肝心ですよね。秀逸なデータベース設計には本当に憧れます^^
「自分がわかればそれでいい」という設計では大きな障害に見舞われる日もそう遠くはないかもしれません。
最初は必要ないと思っても、拡張性が高い設計にしておくことは、将来への自分への投資に匹敵しそうな勢いです!
今日も知識欲は止まらない。