ソーシャルブックマークシステムを作ってみる
RDBを用いたシステム構築なんてやったことがない俺がはてブのようなソーシャルブックマークシステムを作ってみるテスト。
まず、今頭の中で出来ていない機能を列挙する。
で、頭の中で出来そうな機能を列挙してみる。
- アカウントの登録(その後の認証方法はお恥ずかしながら勉強中)
- ブックマークの一覧表示
- URLの詳細(タイトル、URL、サマリ、タグ一覧、ブックマークしたユーザ一覧)
- ブックマークの追加(これも認証方法がネックだが…)
- タグ分類
もう少し頭の中にあったような気がしたが、多分妄想だと思うので、あとで追記する場合は追記しておく。
まず、俺が完璧に未経験な、テーブル設計を行ってみる。見本となるデータは自分自身がはてブを利用させてもらっていることだし、そこからテーブル設計ができるんじゃないかなと考え、とりあえずソーシャルブックマークに使えそうなデータを列挙してみた。あるブックマークに関連しそうな情報を全部繋げて、それを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を用いてテーブル作成するのだが、それはまた今度。