# Chapter11-3 「正規化」 ## 6/1 ###### tags:`基本情報技術` さつき: * データに矛盾や重複が生じないよう、表を最適化する。 * 非正規系→第一正規系→第二正規系→第三正規系 * 非正規系 * 繰り返し部分を持っている。 * 第一正規系 * 繰り返しを除く * 第二正規系 * 関数従属 * 主キーが定まれば、列の値が一意に定まる関係 * 部分関数従属 * 複合キーの一部の項目だけで、列の値が一意に定まる関係 * [DBを正規化するということ](https://qiita.com/yukihirasawa1206/items/c2dedcc51c01c1bd8ccc) > ユーザーが存在しない都道府県はデータとして登録できない > 正規化後のテーブルであれば都道府県のデータは「都道府県テーブル」に切り出されているのでユーザーの存在に関係なくデータの登録ができます * 第一正規系...スカラ値の原則:一つのセルには値は一つでなければならないという原則 うーん...むずかし。。 * 過去問 * 問1:ふむ。OK * 問2:OK! にわ: - 読み込み * データの正規化:データに矛盾や重複が生じないよう表を最適化すること。 * 整理していく段取り * 非正規形 * 繰り返し部分があり、各レコードの長さがバラバラ。 * ex)1つの受注番号に2商品ある場合と、1商品しかない場合、など。受注番号でまとめてると商品情報の部分は繰り返しになるので、レコードの長さはバラバラになる。 * 第1正規形 * 非正規形の表から繰り返し部分を取り除いたもの。 * 取り除いたものは別の独立したレコードとして挿入する。 * 上の例だと、同じ注文番号で複数商品分のレコードが作られることになる。 * 第2正規形 * 関数従属:主キーが決まれば列の値が一意に決まる関係 * 部分関数従属:複合キーの一部の項目だけで列の値が一意に決まる関係(複数ある主キーの一部に対して関数従属である) * 第2正規形は、部分関数従属している列を取り出した形。=第2正規形の表は、上の例だと1つの受注に関して「受注表(受注情報)」「商品表(商品情報)」「受注明細表(受注と商品の紐付け)」に分ける 的な * 第3正規形 * 主キー以外の列に関数従属した列を切り出した形 * 上の例だと、受注情報・商品情報・受注と商品の紐付け の他に、顧客情報があるが、顧客情報は元の受注表の主キーである受注番号に紐づくものではないのでここを切り出す、といった感じのこと。 * →こうやって正規化していくと適切なデータが作られる。DB設計的な。 - 過去問 * 問1:お。。なるほど。矛盾、重複しないようにするのを「冗長性を排除」っていうのか・・・ * 問2:ウかエで迷った、頭ではわかった気でも正規化するの難しいな・・・具体的にダミーで表作ってみた方がわかりそう * ざっくりだけど、関数従属が連鎖しないように1個ずつ切り出せってことか〜 ちさと: * 正規化は段階的におこなわれる * 非正規形 * 正規化されておらず、繰り返す項目がある * 第1正規形 * 繰り返しを除いたもの * 第2正規形 * 部分関数従属している列を切り出したもの * 例)主キー(受注No)→ 受注した日付、顧客コード、顧客名称が決まる * ↑これが受注表というひとつの表になる * こういう感じで複数の表に切り出してく * 第3正規形 * 主キー以外の列に関数従属しているのを切り出したもの * 例)先ほどの主キー(受注No)ではなく、顧客コードをキーとして、顧客名称を決める * 関数従属と部分関数従属 * 主キーに対して、その項目がどんな関係かを表す * 例)主キー(社員番号)が決まる → 名前、部署が決まる * この関係を「関数従属」という * 主キーのいち部分に対して、関数従属する場合は「部分関数従属」という * 過去問 * 問1:ふむふむ…日本語ってむずい * 問2:主キーとどれが関数従属する関係なのかパッとわからん…