CakePHPとMySQLで作るタグ機能 ①テーブル設計

2014-030-18 一部記事を訂正

 

はじめに

動画や画像などのコンテンツを扱うWebサイトでよく目にするタグ機能。

自分のサービスにも組み込みたいという人は少なくないと思います。

一見簡単そうに思えるタグのデータベース構成ですが、今回作成するにあたって、思いのほかたくさんの考え方があることを知ったので、調べた結果と、実装例を記録しておこうと思います。

なお、ここでは動画へのタグ付けを例に実装方法を紹介します。

実装編はこちら

実装方法の調査

データベースでタグを管理しようと考えた時、いくつかの実装手法が考えられます。

タグに求められる機能は大きく以下の4つかと思います。
  • コンテンツに対するタグの追加
  • コンテンツからのタグの削除
  • コンテンツとタグの多対多の構造
  • タグからコンテンツを検索
基本的には追加と削除だけで、更新が必要無い。というのが一つの大きな特徴ですね。

すなわち、「コンテンツと別のテーブルでタグを管理し、IDで紐付ける」という設計は必須ではありません。

※システムの仕様によっては必要になると思いますので、ご注意ください

そのようなタグ機能の特徴を踏まえ、こちらのエントリーでは、以下の3つの手法について説明しています。

MySQLicious法

コンテンツのテーブルの中にタグも入れてしまう方法 テーブルが一つで済むという利点がある。

データ型によってはタグ数が制限される。おそらく検索は遅く、削除・拡張もしにくい。

id
title
tags
1きゃりーぱみゅぱみゅ|インベーダーインベーダー音楽
きゃりー
2iPhoneをミキサーにかけてみたエンターテイメント
apple

Scuttle法

MySQLicious法を正規化した手法。

タグ数の制限の問題を避けられるが、テーブルは2つになる。

Contents

id
title
1きゃりーぱみゅぱみゅ|インベーダーインベーダー
2iPhoneをミキサーにかけてみた


Tags

id
content_id
tag
11音楽
21きゃりー
32エンターテイメント
42apple

Toxi法

中間テーブルを設けてコンテンツとタグを紐付ける。

タグ毎にレコードが生成されるため、階層構造を作ったりすることが容易であり、おそらく検索も速くしやすい。

コンテンツとタグが紐付いた状態で一方が削除されると参照先がなくなるため、管理が少し大変になる。

Contents

id
title
1きゃりーぱみゅぱみゅ|インベーダーインベーダー
2iPhoneをミキサーにかけてみた


Contents_Tags(中間テーブル)

id
content_id
tag_id
111
212
323
424


Tags

id
tag
1音楽
2きゃりー
3エンターテイメント
4apple


 

CakePHPでの実装方針

3つのタグ管理方法を紹介しました。

この中から状況に応じて最適な手法を選択するわけですが、CakePHPにはタグ管理に便利なhasAndBelongsToMany (HABTM)というリレーションシップが存在します。

http://book.cakephp.org/2.0/ja/models/associations-linking-models-together.html

HABTMは多対多のデータモデルを表現するためのリレーションシップであり、上で説明したタグ管理方法のうち、Toxi法の考え方にあたります。

このリレーションシップを使用することで、コンテンツに紐付いたタグを取得することや、タグに紐付いた動画を検索することが簡単できます。

今回はこのHABTMを使用してタグ機能を実装していこうと思います。

しかし記事が長くなったので、実装の説明は次回に回そうと思います。 引き続き、こちらの記事を御覧ください。