2010/12/27

DBの正規化とeclipseの機能

php講習 12/27

<テーブルを作るときのルールの説明>

・正規化について
第一正規化:値がユニークになるようにする
第二正規化:主キーに部分従属している部分を分離する
第三正規化:推移従属関係を分離する
今回は、第二までを説明。詳しい(判りにくい)説明

・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

1 件のコメント:

  1. やっぱハードル高かったですかね・・・でも、おそらく誰もどこでも教えてくれないと思ったので(私も正規化について人から聞いたことがありません)、多少強引に進めました。ご意見ありがとうございます。

    返信削除