自分のサイトの商品に、
ユーザーが自分で「タグ」を指定することができるようにするには、
どういう設計をすればいいのでしょうか?
mysql/phpで構築しています。
A商品に、
ユーザXが「あ」「い」「う え」というタグをつけ、
ユーザYが「あ」「お」とタグをつけた場合、
A商品ページに
「あ」「い」「う え」「お」のタグ一覧が表示され、「あ」は2個ついてるので文字を大きくする、というようなイメージです。
タグテーブルを作って、
商品名:ユーザID:タグ などのカラム一覧で、
タグカラムにタグをカンマ区切りなどで入れていってるのかなぁ、なんて想像してます。
アドバイスや、参考になりそうなサイトを教えて頂けますとうれしいです。
例えばこういうテーブルがあるとします.
テーブル名 | 用途 |
items | 商品マスター |
users | ユーザーマスター |
item_tags | 商品タグマスター |
CREATE TABLE items ( id integer NOT NULL PRIMARY KEY, name varchar(200) NOT NULL, price integer NOT NULL );
CREATE TABLE users ( id integer NOT NULL PRIMARY KEY, name varchar(200) NOT NULL, email varchar(200) NOT NULL, login_name varchar(100) NOT NULL, login_password varchar(40) NOT NULL );
CREATE TABLE item_tags ( id integer NOT NULL PRIMARY KEY, user_id integer NOT NULL, item_id integer NOT NULL, name varchar(200) );
商品の追加は下記のようにやります.
INSERT INTO items (id, name, price) VALUES( 1, '商品1', 100); INSERT INTO items (id, name, price) VALUES( 2, '商品2', 200);
ユーザーの追加は下記のようにやります.
INSERT INTO users (id, name, email, login_name, login_password) VALUES( 1, 'ユーザー1', 'user1', 'user1@example.com', '暗号化,ハッシュ化したパスワード'); INSERT INTO users (id, name, email, login_name, login_password) VALUES( 2, 'ユーザー2', 'user2', 'user2@example.com', '暗号化,ハッシュ化したパスワード');
この上で,「user1」さんが商品番号1にタグ「書籍」「参考書」を付加するには下記のようにします.
INSERT INTO item_tags (id, user_id, item_id, name) VALUES( 1, 1, 1, '書籍'); INSERT INTO item_tags (id, user_id, item_id, name) VALUES( 2, 1, 1, '参考書'); INSERT INTO item_tags (id, user_id, item_id, name) VALUES( 3, 1, 2, 'MUSIC'); INSERT INTO item_tags (id, user_id, item_id, name) VALUES( 4, 1, 2, 'CD');
この上で,「user2」さんが商品番号1にタグ「本」「後で読む」を付加するには下記のようにします.
INSERT INTO item_tags (id, user_id, item_id, name) VALUES( 5, 2, 1, '本'); INSERT INTO item_tags (id, user_id, item_id, name) VALUES( 6, 2, 1, '後で読む'); INSERT INTO item_tags (id, user_id, item_id, name) VALUES( 7, 2, 1, '参考書'); INSERT INTO item_tags (id, user_id, item_id, name) VALUES( 8, 2, 2, 'CD'); INSERT INTO item_tags (id, user_id, item_id, name) VALUES( 9, 2, 2, '音楽');
こうすることにより,商品に付加されたタグの数などをSELECG時にSQLだけで算出することができるようになります.
ユーザー1が商品1に付加している商品にタグ
SELECT * FROM item_tags WHERE user_id = 1 AND item_id = 1;
商品にタグを貼っているユーザー数
SELECT COUNT(*) FROM (SELECT user_id FROM item_tags WHERE item_id = 1 GROUP BY user_id) AS rows;
商品に貼られている全タグ
SELECT * FROM item_tags WHERE item_id = 1 GROUP BY name;
ユーザー1が商品に付加している全タグ
SELECT name FROM item_tags WHERE user_id = 1 GROUP BY name;
軽くテストしただけなのでSQLミスなどあるかもしれません.
例えばこういうテーブルがあるとします.
テーブル名 | 用途 |
items | 商品マスター |
users | ユーザーマスター |
item_tags | 商品タグマスター |
CREATE TABLE items ( id integer NOT NULL PRIMARY KEY, name varchar(200) NOT NULL, price integer NOT NULL );
CREATE TABLE users ( id integer NOT NULL PRIMARY KEY, name varchar(200) NOT NULL, email varchar(200) NOT NULL, login_name varchar(100) NOT NULL, login_password varchar(40) NOT NULL );
CREATE TABLE item_tags ( id integer NOT NULL PRIMARY KEY, user_id integer NOT NULL, item_id integer NOT NULL, name varchar(200) );
商品の追加は下記のようにやります.
INSERT INTO items (id, name, price) VALUES( 1, '商品1', 100); INSERT INTO items (id, name, price) VALUES( 2, '商品2', 200);
ユーザーの追加は下記のようにやります.
INSERT INTO users (id, name, email, login_name, login_password) VALUES( 1, 'ユーザー1', 'user1', 'user1@example.com', '暗号化,ハッシュ化したパスワード'); INSERT INTO users (id, name, email, login_name, login_password) VALUES( 2, 'ユーザー2', 'user2', 'user2@example.com', '暗号化,ハッシュ化したパスワード');
この上で,「user1」さんが商品番号1にタグ「書籍」「参考書」を付加するには下記のようにします.
INSERT INTO item_tags (id, user_id, item_id, name) VALUES( 1, 1, 1, '書籍'); INSERT INTO item_tags (id, user_id, item_id, name) VALUES( 2, 1, 1, '参考書'); INSERT INTO item_tags (id, user_id, item_id, name) VALUES( 3, 1, 2, 'MUSIC'); INSERT INTO item_tags (id, user_id, item_id, name) VALUES( 4, 1, 2, 'CD');
この上で,「user2」さんが商品番号1にタグ「本」「後で読む」を付加するには下記のようにします.
INSERT INTO item_tags (id, user_id, item_id, name) VALUES( 5, 2, 1, '本'); INSERT INTO item_tags (id, user_id, item_id, name) VALUES( 6, 2, 1, '後で読む'); INSERT INTO item_tags (id, user_id, item_id, name) VALUES( 7, 2, 1, '参考書'); INSERT INTO item_tags (id, user_id, item_id, name) VALUES( 8, 2, 2, 'CD'); INSERT INTO item_tags (id, user_id, item_id, name) VALUES( 9, 2, 2, '音楽');
こうすることにより,商品に付加されたタグの数などをSELECG時にSQLだけで算出することができるようになります.
ユーザー1が商品1に付加している商品にタグ
SELECT * FROM item_tags WHERE user_id = 1 AND item_id = 1;
商品にタグを貼っているユーザー数
SELECT COUNT(*) FROM (SELECT user_id FROM item_tags WHERE item_id = 1 GROUP BY user_id) AS rows;
商品に貼られている全タグ
SELECT * FROM item_tags WHERE item_id = 1 GROUP BY name;
ユーザー1が商品に付加している全タグ
SELECT name FROM item_tags WHERE user_id = 1 GROUP BY name;
軽くテストしただけなのでSQLミスなどあるかもしれません.
どうもありがとうございます。
それぞれ1レコードごとにタグ管理すると便利なのですね。
とてもわかりやすかくて助かりました。
データベースやテーブルの設計も悩んでいたので、
こちらの部分でもとても参考になりました。
ありがとうございます!
どうもありがとうございます。
pearにこんなものまで・・・。
コーディングの参考になりそうです。
ありがとうございます。
この質問普段ぼーっと考えていたことなのでちょうどよかったというだけで(苦笑
ちなみにphpspotのものは今となっては情報が古いですね.
件のパッケージは既に正式リリースされています.
http://pear.php.net/package/HTML_TagCloud
pearコマンドが正常に動作する(かつバージョン1.4系以上)なら
$ pear install --alldeps HTML_TagCloud (LinuxなどUNIX系の場合) $ pear.bat install --alldeps HTML_TagCloud (Windowsの場合)
でインストールできるかもしれません
(場合によってはrootやAdministratorなどの管理者権限が必要です)
マニュアルも公式な日本語マニュアルがあるので参考になさってください.
http://pear.php.net/manual/ja/package.html.html-tagcloud.php
どうもありがとうございます。
pear使うとホントに楽ですねぇ・・・。
でもpear使うと自由度が低くなりそうで混乱しそうなので、
教えて頂いたコードを基本として、
pearのコードを参考にしながら作ってみようかな、と思っています。
こんなに読みやすくコードを表示して頂けると、
参考にしながら自分で打ちたくなってきますね(笑)
どうもありがとうございます。
それぞれ1レコードごとにタグ管理すると便利なのですね。
とてもわかりやすかくて助かりました。
データベースやテーブルの設計も悩んでいたので、
こちらの部分でもとても参考になりました。
ありがとうございます!