MyMiniCity踏んでください!!

ただいま絶賛MyMiniCity参加中です.是非リンクを踏んでください!!(笑
May 28th, 2007

タグを実現するテーブル設計を妄想する

(Read: 7375)
Add to Hatena Bookmark Add to livedor clip! Buzzurlにブックマーク Add to del.icio.us このページを行き先登録 Add to drecom Add to MM/Memo Add to FC2 Bookmark Yahoo!ブックマークに登録

参照: はてなブクマやblog等で最近よく見かける「タグ」システムについて。 自分のサイトの商品に、 ユーザーが自分で「タグ」を指定することができるようにするには、 どういう.. - 人力検索は
そういえばちゃんとタグ関連の処理って書いたことがないなーと思ったので妄想してみた.
パフォーマンス的には天井が高くなさそうだけど.
下記はてなに書いたのをそのままコピペ.

テーブル構造

テーブル名用途
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)
);
  • 実際にはプライマリキーのidは自動採番(MySQLならautoincrement,PostgreSQLならSERIAL)させるほうが好ましい
  • パフォーマンスを維持するためには適切なインデックスを付加する必要があります

レコードの追加

商品の追加は下記のようにやります.


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だけで算出することができるようになります.

テスト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ミスなどあるかもしれません.

トピックの参照元

▼最近のトピック

▼ 人気のトピック


< 過去の記事 [ 2月の All Categories リスト ] 新しい記事 >

執筆に関わりました>>



Powered by Alexa.
[プレスブログ]価値あるブログに掲載料をお支払いします。
The $5 Script Archive
The best of PHP, MySQL, Flash and XML technologies, brought together at one low price.
Powered by gsblog (customize)

[ POST ] [ AddLink ] [ CtlPanel ]

Subscribe blog

  • Bloglinesで登録
  • Subscribe with livedoor Reader
  • はてなで購読
  • Yahoo! RSSリーダーで購読
  • Add to Google

Bookmark blog

  • Add to Hatena Bookmark
    blog.poyo.jp の新着ブックマーク
  • Add to livedor clip!
  • Buzzurlにブックマーク
  • Add to FC2 Bookmark
  • Yahoo!ブックマークに登録

About me

応援しています

我が息子が産まれたアクア・バースハウス(東京都世田谷区にある助産院)を応援しています.

翻訳のお仕事

腕に自信がある方,修行をしたい方はこちらをどうぞ.

2012 calendar

2月
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29
| Day | Month | Year |

Powered by RRDTOOL.

Archives

Categories

Links


Mail to admin
myblogへ行く blog Rankingへ行く RSS feed meter for http://blog.poyo.jp/ Search Engine Optimization blogoole pingサーバ
blogpeople.netに登録!!

Hatena Ring

スカウター : よくきたblog

My Google news

Related site

ころんころん♪ べびぽよ フォト蔵Wiki
string(14) "/id-1180326804"