ソーシャルブックマークシステムを作ってみる

RDBを用いたシステム構築なんてやったことがない俺がはてブのようなソーシャルブックマークシステムを作ってみるテスト。
まず、今頭の中で出来ていない機能を列挙する。

  1. RSS配信(フォーマットとか分からん)
  2. 認証(認証済みか否かをチェックする方法とかが分からん)
  3. AtomPP(これが出来ればURIがすっきりしそうだけど、保留)

で、頭の中で出来そうな機能を列挙してみる。

  1. アカウントの登録(その後の認証方法はお恥ずかしながら勉強中)
  2. ブックマークの一覧表示
  3. URLの詳細(タイトル、URL、サマリ、タグ一覧、ブックマークしたユーザ一覧)
  4. ブックマークの追加(これも認証方法がネックだが…)
  5. タグ分類

もう少し頭の中にあったような気がしたが、多分妄想だと思うので、あとで追記する場合は追記しておく。


まず、俺が完璧に未経験な、テーブル設計を行ってみる。見本となるデータは自分自身がはてブを利用させてもらっていることだし、そこからテーブル設計ができるんじゃないかなと考え、とりあえずソーシャルブックマークに使えそうなデータを列挙してみた。あるブックマークに関連しそうな情報を全部繋げて、それを1行にしている。

ID, passはユーザのログインIDとパスワードを意味し、URLはページのURL, titleはページのタイトルを意味する。tagはブックマークに付けるタグを意味し、commentはブックマーク時のコメントを意味する。dateはブックマークした日付、summaryはページの内容を意味する。

ID pass URL title tag comment date summary
todo gzm http://b.hatena.ne.jp/todogzm/ はてなブッ(ry hatena ブックマークに対するコメント 2006/06/01 はてブ
todo gzm http://rikunabi-next.yahoo.co.jp 残業しないで... ネタ 残業して... 2006/05/01 現在、...
nazo log http://www.atmarkit.co.jp/fjava/rensai3/eclipseplgn11/eclipseplgn11_1.html ビルドを効率 joel, maven, eclipse maven2... 2006/4/30 Java開発...

第1正規化

第1正規化は繰り返し構造があれば分解する…らしい。たとえばこの例だと(例が少ないのは書くのが面倒だったから)、IDが繰り返し構造になるようだ。ID, passを1つのテーブルとし、URL, title, tag, comment, date, summaryを別のテーブルとする。ここで仮にID(FK)を外部キーとする。
ユーザテーブル

ID pass
todo gzm
nazo log

ブックマークテーブル

ID(FK) URL title tag comment date summary
todo http://b.hatena.ne.jp/todogzm/ はてなブッ(ry hatena ブックマークに対するコメント 2006/06/01 はてブ
todo http://rikunabi-next.yahoo.co.jp 残業しないで... ネタ 残業して... 2006/05/01 現在、...
nazo http://www.atmarkit.co.jp/fjava/rensai3/eclipseplgn11/eclipseplgn11_1.html ビルドを効率 joel, maven, eclipse maven2... 2006/4/30 Java開発...

第2正規化

第2正規化は部分関数従属を分解…らしい。ここでは、ブックマークするページについての情報と、ページに対するユーザの情報とに分解する。つまり、ブックマークに対して、ID, URL, title, summaryと、ID, tag, comment, dateに分解する。

ユーザテーブル

ID pass
todo gzm
nazo log

ページテーブル

ID(FK) URL title summary
todo http://b.hatena.ne.jp/todogzm/ はてなブッ(ry はてブ
todo http://rikunabi-next.yahoo.co.jp 残業しないで... 現在、...
nazo http://www.atmarkit.co.jp/fjava/rensai3/eclipseplgn11/eclipseplgn11_1.html ビルドを効率 Java開発...

ブックマークテーブル

ID(FK) URL(FK) tag comment date
todo http://b.hatena.ne.jp/todogzm/ hatena ブックマークに対するコメント 2006/06/01
todo http://rikunabi-next.yahoo.co.jp ネタ 残業して... 2006/05/01
nazo http://www.atmarkit.co.jp/fjava/rensai3/eclipseplgn11/eclipseplgn11_1.html joel, maven, eclipse maven2... 2006/4/30

第3正規化

第3正規化は推移従属の分解らしい。ページテーブルのtitle, summaryは必ずURLに従属するので、これを分解する。というか多分上のページテーブルのうち、ID(FK)を消して、URLがPKEYになればいいだけやんと思ったので、そう変更しておく。

ページテーブル

URL title summary
http://b.hatena.ne.jp/todogzm/ はてなブッ(ry はてブ
http://rikunabi-next.yahoo.co.jp 残業しないで... 現在、...
http://www.atmarkit.co.jp/fjava/rensai3/eclipseplgn11/eclipseplgn11_1.html ビルドを効率 Java開発...

第4正規化

最後に、nazoアカウントが登録しているブックマークのように、タグが複数並ぶことがある。これは第4正規化による分解らしいが…詳細は忘れてしまった(;´-`)もう寝る時間も間近なので、URLだけ置いて割愛(笑)
http://www.atmarkit.co.jp/fdb/rensai/db_enginer03/db_enginer03_4.html

ブックマークテーブル

ID(FK) URL(FK) tag comment date
todo http://b.hatena.ne.jp/todogzm/ hatena ブックマークに対するコメント 2006/06/01
todo http://rikunabi-next.yahoo.co.jp ネタ 残業して... 2006/05/01
nazo http://www.atmarkit.co.jp/fjava/rensai3/eclipseplgn11/eclipseplgn11_1.html joel, maven, eclipse maven2... 2006/4/30

これが、ブックマークIDを導入し、タグはブックマークIDと関連づける。

ブックマークテーブル

bid ID(FK) URL(FK) comment date
1 todo http://b.hatena.ne.jp/todogzm/ ブックマークに対するコメント 2006/06/01
2 todo http://rikunabi-next.yahoo.co.jp 残業して... 2006/05/01
3 nazo http://www.atmarkit.co.jp/fjava/rensai3/eclipseplgn11/eclipseplgn11_1.html maven2... 2006/4/30

タグテーブル

tagid bid(FK) tag
1 1 hatena
2 2 ネタ
3 3 joel
4 3 maven
5 3 eclipse


こんな感じでテーブルは分割できた。
これをSQLを用いてテーブル作成するのだが、それはまた今度。