<テーブルを作るときのルールの説明>
・正規化について
第一正規化:値がユニークになるようにする
第二正規化:主キーに部分従属している部分を分離する
第三正規化:推移従属関係を分離する
今回は、第二までを説明。詳しい(判りにくい)説明
・mysqlにて説明資料のテーブルを作成、データ入力、結果確認
> select * from jyukou;
> select * from course;
> select * from student;
・項目属性textとvarchar、charの使い分けについて
あとで説明します。
・第二正規化したテーブルを使って、第一正規化の一覧表を出力する
ためのselect文を作る。
・先週の復習、select文に条件追加
(1)鎌倉校の受講生
WHERE ... and c.c_place = "鎌倉校"(2)英語の受講生
WHERE ... and c.c_name like "%英語%"
・mysqlでの注意事項
> select ... > where ... > and > c.c_name like "%英語%" > ORDER BY > j.jyukou_id ascこのselect文で、「英語%」のあとに半角スペースが必要です。
半角スペースがないと、order句を認識してくれないことがあります。
・外部キー
外部キーを設定するときは、面倒な制約が発生する。
キーにnull値が使えない。
参照先が登録されていないデータは登録できない。
参照されているデータは削除出来ない。
・外部キーが設定されていることで、制約条件が守られるので
データの整合性が保たれる。
(不正なデータが入力されることを未然に防ぐ)
・カラムがtext属性のときはindexを付けられない。
char,varcharには付けられる。
・外部参照を使うときは「InnoDB」を使う(拡張機能)
ENGINE=InnoDB
・さきほど作ったテーブルからフランス語を消す
> delete from course where c_num=6;
しかし、受講生は残ったままなので、受講テーブルとコーステーブルで不整合が発生している。
・不整合を起こさないために、外部参照を使って、テーブルを作成
そのあと、もう一度フランス語を削除してみるとエラーになる。
mysql> delete from course where c_num=6;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`study`.`jyukou`, CONSTRAINT `jyukou_ibfk_2` FOREIGN KEY (`c_num`) REFERENCES `course` (`c_num`))
mysql>
外部参照を定義することでテーブル間の不整合が起きるのを防ぐことが出来る。
・では、どうしたら不整合が起きないでデータを削除できるのか?
→先にフランス語を受講している人を消してからフランス語を消す。
> delete from jyukou where c_num=6;
> delete from course where c_num=6;
・今回は、外部参照で制限をしたが、phpのプログラムで制限を
チェックすることも可能。必ずしもDBで制限することはない。
(不整合を防止するなら、どこかではやる必要あり)
・ER図の説明
・正規化の練習
今日の正規化はハードルが高い。
でも、テーブルの構成を考える場合は必要になる知識なので、
説明を受けておくのは良いことだと思う。
<eclips>
・eclipsとは(wikipedia)
・IDEとは、統合開発環境
コンパイラ
テキストエディタ
デバッカ(実行環境)
プロジェクト管理
チーム開発(SVN,CVS)
作業補助(関数補完)
ビルド、デバック補助
・他のIDEあり
VisualStudio
Sun MicorSystem NetBeans
・eclipsの起動
・ワークスペースの指定
../xampp/htdocs
・設定
実行環境、設定済みだった。
・プロジェクト
新規、PHPプロジェクト(プロジェクト名は日本語を使わない)
プロジェクト名と同じフォルダがxamppフォルダの下に出来る。
・ファイルを作るときのファイルはPHPファイル
・補完機能
文字を打ってから(例えばprintならp)、ctrl+space
やっぱハードル高かったですかね・・・でも、おそらく誰もどこでも教えてくれないと思ったので(私も正規化について人から聞いたことがありません)、多少強引に進めました。ご意見ありがとうございます。
返信削除