2010年12月27日月曜日

12/27覚書

いまさらメモ
プロンプトって;つけないでEnterすると改行できるんDA!
てか気づくの遅EEEEEEEEEEEE

desc テーブル名;で各カラムのステ内容がでてくる。


☆ テーブルの正規化(参照フォルダは1227)
・システム設計の最初に行うこと
・テーブルを一定のルールで変形し利用効率をあげる=正規化
・第1~第5段階まであるが、最近は第2段階までの利用が多い。

★非正規化(素)
・Excelでセルに複数個

★★間違った修正★★
横に足さない!! 一度つくったテーブルにカラム追加はありえない!!

★正規化手順1
データは縦に足す。
1レコードのデータがすべてユニークになるように変更。

問題点
カラムごとの重複データが生じる。

★正規化手順2
受講者情報を格納したテーブルと講座情報を格納したテーブルに分割し独立。
◆これだけだと関連付けがないので、今回は受講者番号と口座番号のみのテーブルを別途作成。

第2正規化 受講だと第1正規化のシートとイコールになる。joinで連結できる。
これでtextの重複データをなくし、軽いintでの管理が可能となる。

◆VARCHARとCHARとTEXTの違い
CHARは固定文字列。CHAR(2)なら二文字必ず入力。
固定化したほうがメモリを食わないのでコストパフォーマンスに優れる。

最大の違い。
VARCHAR、CHARのカラムはindex可。
TEXT型のカラムにはindex不可。
indexをつけたいカラムの文字列はあらかじめVARCHARにしておく。

★1227フォルダのテーブルとデータインポート。復習のため記述省略

◆単純結合joinで練習~※途中※

select
    student.id,
    student.name,
    address.student_id,
    course.course_name,
    jyukou.jyukou_name
from
    student,
    jyukou,
    course
where
    address.student_id = jyukou.jyukou_id
    and address.course_id = .course_id;

★単純結合join超わかりやすいサンプル

SELECT
    j.jyukou_id as "受講ID",
    s.s_name as "受講者名",
    s.s_address as "受講者住所",
    s.s_tel as "受講者TEL",
    c.c_name as "コース名",
    c.c_place as "開講場所",
    c.c_day as "開講日",
    c.c_teacher as "担当講師"
FROM
    student as s,
    course as c,
    jyukou as j
WHERE
    j.s_num = s.s_num
    and
    j.c_num = c.c_num
ORDER BY
    j.jyukou_id asc
;

◆鎌倉校だけ抜き出す
    and c.c_place like '鎌倉%'
◆英語講座だけ抜き出す
    and c.c_name like'英語基礎%'

◆データを削除した場合
※素朴に忘れてた削除命令;
delete from テーブル名 where カラム名;

削除すると結合時に存在しないデータの影響で不整合が起きてしまう。

☆リレーションシップ 関連付け
上記のままだと各個単独のテーブルのため、つど関連付けをするのは効率が悪い。
そのため外部参照という処理で親テーブルと子テーブルに設定すると連携できる。
正規化とセットで動くかなり一般的な手法なので覚えておこう。

◆外部キー参照のcreate tableで再生成。
◆指定したいカラムはnot nullで主キーかuniqueキー必須。
◆親テーブルには検索対象カラムにはindex必須。
ついでに検索対象になりうる項目も指定する。(上記条件クリアのテーブル限定)
↓index前の名前は変数みたいなの。好きにつけられる。
    INDEX studentIndex ( s_num, s_name, s_tel ) ←カラムは複数可能
◆メリットとデメリット

メリット:誤削除、不要な追加不可→不整合なデータが存在しない。

削除しようとしてもこんなエラーが出る
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`))

削除は先に子テーブルの関係するidから削除する。
courseのid6を削除したいなら、先にjyukouのidが6のものを削除。
追加は先に親テーブルのカラムにデータを追加する

デメリット:NULL値利用不可。NULL値がどうしても入ってしまうテーブルなら外部参照は不向き。

※外部参照なくてもphpで制御する手法もある

参照先は子テーブルで設定する
FOREIGN (フォーリン):外部の
REFERENCES (リファレンス):参照
    FOREIGN KEY ( s_num ) REFERENCES student ( s_num ),
    FOREIGN KEY ( c_num ) REFERENCES course ( c_num )

◆ENGINE=InnoDB ??
MySQLにはいくつかのエンジンがあり、デフォルトはMyISAMだが、
外部参照を使うための拡張オプションとしてInnoDBに指定する必要がある。
ソースの一番最後でおk。
ENGINE=InnoDB

★定義の文書化 正規化手順.ods参照
いわゆるコードまとめと注釈。現場で提出要求あるので作成するくせをつけよう。

★ER図。相関図 正規化手順.ods参照
リンクツリーみたいなの。大規模システムだと必須。(つか視覚化ソフトありそう;)

★練習問題
正規化ステップ
1.縦にグループ化
2.重複データを排除
3.1テーブルにuniqueな番号をつけて、primaryキーに設定。
4.整数型で紐付ける。

☆eclipseとは?
IBMが開発した総合開発環境=IDE eclipse解説はここ
IDEて?
・プロジェクト管理
・チーム開発
・作成補助
・コンパイラ
・テキストエディタ
・ビルド、デバッガ
をひとくくりでできるソフト。

eclipseで初期プロジェクトちょっと作った。明日はもっと触りそう。