データベース第3回目 意味ごとにテーブルを分ける

データベース第3回目
意味ごとにテーブルを分ける
2003年7月3日
by CreW
前回の復習(前回の目標)
• Javaのプログラムからデータベースを使
える
 JDBCとは何か,説明できる
• JDBCとは?JDBCドライバとは?
 JDBCを使えるようになる
• JDBCの主要なクラスは?
前回の復習(前回学んだこと)
• Javaプログラムから
 テーブルにデータを挿入する方法
 テーブルに入っている情報を取得する方法
今回の目標
• テーブルを意味によって分ける理由が分か
る
• 2つのテーブルを関連付ける方法がわかる
今回変更する点
• 前回の「サブゼミ疑問だらけ掲示板」は
全員に共通した「入室パスワード」で入
室できた.
• 今回は投稿者ごとに異なったログイン名
とパスワードによって入室可能にしたい.
テーブルを設計する
• 先週のテーブルに新たな項目を追加した
depar grade contri login
tment
butor
title
conte date
nt
pass
word
どのようにデータが格納されるでしょうか
実はこの設計には問題があります
このテーブルの問題を
整理しよう
• 投稿者の新規作成をする毎に情報のないデータ
•
(タイトル,内容,投稿日)が存在する
情報が重複している(投稿するごとにログイン
名とパスワードを格納するのは非効率)
意味の違う情報が同じテーブルで管理されて
いるから使いにくい
問題点を検証してみよう
• 武田林太郎さんが投稿者登録をして発言する
• 実際にテーブルを作って操作してみよう
depar grade contri login
…
tment
butor …
総合政
策学部
4年
武田林
太郎
title
…
s00581 null
rt
conte date pass
… word…
nt…
null
null
①新規ユーザ登録をする
②投稿する
このように格納するしかありません!
rintaro
テーブルに意味を持たせる
• ここでの問題は,意味の違う情報が一つ
のテーブルにあることです
扱うデータを整理しましょう
質問掲示板で扱うデータは、
• 投稿者情報
 学部名,学年,投稿者名,ログイン名,パスワード
• 投稿情報
 タイトル,内容,投稿日
これらを格納できるようにテーブルを作りま
しょう
意味ごとに
テーブルを分けよう
• 投稿者情報と投稿情報は別々テーブルて
管理しよう
投稿者情報
学部名
学年
投稿者
ログイン名
投稿情報
タイトル
内容
投稿日
パスワード
意味ごとにテーブルを分けなかった
場合の問題
• 意味ごとにテーブルを分けなかったらど
んな問題があるでしょう?
意味ごとにテーブルを分けなかった
場合の問題
• ほかにもこんな問題が考えられます
 情報に重複が出る
(投稿の毎に会員の情報を入れている)
 変更がとても大変
(例:100回発言した会員が、メールアドレ
スを変更したくなったら??)
意味ごとにテーブルを
分けたけど・・
• それぞれの投稿情報は投稿毎に誰が投稿
したのかを知っていないといけない
• 2つのテーブル間に関連が必要
学部名
学年
タイトル
投稿者
内容
ログイン名
投稿日
パスワード
どの列で関連を
もたせればいいのか
投稿情報は、投稿者情報から一人の投稿
者を特定したい
投稿情報は、投稿者情報のユニークな値
を持つ列項目をもって関連成立したい
テーブル間で関連をもたせる
• 2つのテーブルで同じ値をとる列で関連をも
•
たせる
投稿情報テーブルが投稿した投稿者を特定し
たいので投稿者情報テーブルのいずれかの列
をもてば関連が成立する
学部
総合政策学部
ログイン名
s00581rt
学年
4年
投稿者
武田林太郎
ログイン名
s00581rt
タイトル
内容
Javaについて 分からない点が..
パスワード
rintaro
投稿日
7/2
主キーという概念
• 今回の場合のようにテーブルの行を特定したく
•
•
•
なった場合に、行を一意に識別するための情報
が必要になる
これを、主キーという
主キーとは、テーブルの中で行を特定するため
の情報であり、列を割り当てて用いる
主キーはユニーか値を持つ列でなければならな
い
投稿情報は投稿者情報の主キーをもつこ
とで投稿者を特定できるようになる
• 投稿者名は主キーになれるか?
 同姓同名の投稿者がいると投稿者を特定できないので
だめ
• パスワードは主キーになれるか?
 万が一同じパスワードをもつ投稿者がいたらどちらか
一方かを特定できないのでだめ
• ログイン名は主キーになれるか?
 ログイン名は投稿者ごとに違うもの(ユニーク)なの
で主キーになれる
ログイン名で関連をもたせる
• 投稿情報は投稿者情報の主キーであるロ
グイン名をもって2つのテーブルを関連付
けることによって投稿者を特定できるよ
うになった
今回の目標(再確認)
• テーブルを意味によって分ける理由が分か
る
 テーブルを意味によって分けるといいことは
どんなことでしたか?
• 2つのテーブルを関連付ける方法がわかる
 2つのテーブルを関連付けるにはどうしたら
よかったですか?
実感しよう
• では,実際に2つのテーブルになった質
•
•
•
•
問掲示板を実行しましょう
http://web.sfc.keio.ac.jp/~s00581rt/crew/
上からソースコードを入手
テーブル(.sqlファイル)は自動でサンプル
のテーブルを作成します
mysql questionbbs < sqlファイル名
2つのテーブル情報
• 2つのテーブル
contributordata3
department
grade contributor
総合政策学部 4年
login
password
武田林太郎 s00581rt rintaro
questiondata3
login
title
s00581rt Javaについて
content
分からない点が..
date
7/2
課題
• 投稿できるようにしましょう
• 発展課題は,投稿者の新規作成です