正規化とは?
正規化とは?
【結論】
SQLでデータを扱える形に成形する事。
1つのレコードに複数のデータを入れる事ができないので、仕方なくやる。
横のカラム重複を縦に並べ、さらに縦の重複を減らす。
一つのデータ変更は、一つのレコード変更で対応できる。を基準としてテーブル設計する。
・重複をなくす ・関数従属性を見つける ・中間テーブルを作る ・第三正規化までとりあえず頑張る |
■なぜやるのか?
やらないと、SQLが動かないから。
正規化はデータベース設計で、データの「重複や矛盾」をなくし、データの整合性を高めるためにやる。
正規化によって、重複したデータを持つことで発生する「更新の不整合」や、データの不一致、不完全性、冗長性を防ぎ、データベースの効率的な管理やクエリの実行を可能にします。
正規化によって、データの拡張や変更にも柔軟に対応できるようになります。
これやらないと、動かないので、やりましょ。
フィールドに重複したデータを入れられないのが、問題なんすよ。そう考えると、エクセルって、複数データ入れられるので楽だよね~~
■基本的な思想
テーブル設計は一箇所変更があっただけなら一箇所変更するだけで済むようにというのが基本です。
こんな感じで並べてみる
横方向に並んでいるのを、縦に並べ替える。
レコードの長さが違うので、DBに登録ができません!!
第一正規化では、繰り返し部分を縦にならべて、レコードの長さを整えます。
一部、空白部分がありますが、ここは、同じデータなのでコピペでOK
さらに、金額のカラムがいりません。
単価と数量を計算すればいいので
部分関数従属とは、レシート番号が決まると、決定する部分の事です。
下の場合、「販売日」「社員ID」「販売責任者」ですね。つまり、この部分は、他のテーブルに切り出せます。
次は、ここを正規化します。
レシート番号が分かると、「日付」「誰が売ったのか?」は決まります。
しかし、商品の個数などは誰にもわかりません。
というか、分かったら怖いですが^^;エスパーよね!!
なんやかんやで、こうなります。
これで第三正規化まで達成です。
・1行に並べてみる ・横の重複を縦に並べる ・金額のカラムはいらん ・縦の重複をなくす ・ この店は経営が心配だ |
中間テーブルとは
・一人で複数の科目を選択すると、一つのフィールドに二つのデータになり一意性がなくなる ・だから正規化する ・同じ名前の人がいるのでuser_idをつくる ・「履修科目」と「生徒」は多:多の関係 ・新規の科目を増やすために、第二正規化しておく |
■正規化がなぜ必要か?
データを入力しやすくするため
検索できるようにする
第三正規化までやっておけば、基本は大丈夫
■基本
中間テーブルとは、複数のテーブルの間にある、関係を表すためのテーブルのことを指します。
通常、中間テーブルは、関係を表す2つのテーブルの主キーを含む列を持ち、それらの主キーを外部キーとして参照しています。
中間テーブルは、多対多の関係を表現するために使用されることが多く、例えば、1つのユーザーが複数の役割を持ち、1つの役割が複数のユーザーに割り当てられるような場合に使用されます。
多:多とは何か?
人間(user)は、多数の部活(club)に入れる。
この場合、中間テーブルを用意しておくと、SQLが動かせる形になるって事です。
■中間テーブルの説明
中間テーブル(members)が関連を示してくれます。
中間テーブルがある事で、userテーブルはclubのid情報を持たなくて済みます。
さらにclubテーブルは、userテーブルの情報を持たなくてよくなります。
中間テーブルには、複合主キーを設定してあげれば、重複する問題を解決できます。
■中間テーブルの進化
部活のボスを設定したり、会計係など役割をテーブルに登録するなど、項目が増えると
中間テーブルがかなり重要な役割を持ってくるので、ちゃんとした名前を付けておくとよい!!
・中間テーブルには複合キーを設定 ・二つのカラムで、一意性を出せばよい ・userはclubの情報を直接もたなくてすむ ・この概念が最初はむずいっす |
複合主キー
複数の項目がワンセットになることで1つの主キーとしての役割を果たす主キーのこと
【参照】
テーブルのid問題
全てのテーブルにはidを付けた方がいいのか?問題
中間テーブル
中間テーブルにはidが必要なのか??
多対多の関連が重複してしまう可能性が出るので、よくない。
すべてのテーブルに id 列を加えると意図に反した影響を生じる事がある
created_atとupdated_atは付ける
created_atは CURRENT_TIMESTAMP
updated_atは CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP を設定する。(MySQLの場合) idとは違い、こちらは中間テーブルであろうとなんであろうと設定するのが推奨です。
created_atとupdated_atの値が違えば生成の後にどこかで更新されたことがわかる。
同時に更新されるはずのデータで、updated_atの日時がずれていれば片方の更新が失敗していると分かる。
アクセスログやsyslogと照らし合わせるようなこともあります。
まとめ
かなりハマりました。
プログラムが書けるようになってもER図の作り方、テーブル、カラムの設計ができないと、システムがつくれないので注意が必要です。
重複と一意性、複合キー、中間テーブルあたりの意味が最初はかなり不明でした。
ER図、正規化については、youtubeを何度もみなおし、さらに、設問などを解いて、どこを間違えたのか?を何度も確認すると良いです。
合わせて、テーブル、カラムの命名規則についても学習しておくとよいかもです。
[参照]
テーブル設計のベストプラクティス idやupdated_atについて
無理せず、楽しく、生産的に働きましょう!ご相談は下記まで
この記事を読んだ人は、こんな記事も読んでいます
■ 基本編 ■
■テーブル・カラム
正規化とは?
ER図
■基本操作■
更新する (UPDATE)
CURDについて
■PhpMyadmin
SQL文を入れる
データを消す
検索する
■csv
■基本の操作02■
制約について知ろう
ビューとは何か?
アップデートについて
■ 設計について■
UMLとは何か?
ER図を覚えよう
■アンチパターン
論理削除
ジェイウォーク(交差テーブルを作らない)
1文字エイリアス
全部小文字
複数列属性(マルチカラムアトリビュート)
パスワード
フラグの闇
■アップロード
SEO対策の基本 外部要因とは?
SEO対策の基本的である、外部要因とは何か?
SEO対策をするなら絶対に知っておきたい、基本知識です。
売れるサイトを作るのに知って起きたい知識
サーチエンジンマーケティングという言葉をご存知でしょうか?
ホームページで商品やサービスを売る時に知っておきたいマーケティング
についてご紹介いたします。
SEO対策をする5つのメリットとは?
なぜ上位表示させることが大事なのか?なぜSEO対策をする必要があるのか
についてご紹介させていただきます。
SEO対策の内部要因とは?
上位表示させるためには、内部要因について知っておくことも大事です。
キーワードを上位表示させるために必要なのは、ソースコードを最適化することです
内部要因の対策について知りたい方はこちらへ
キーワード対策をする前に
そのキーワード対策。ちょっと待ってください。
そのまま対策をすると、必ずお金を損してしまいます。個人事業主や中小企業は
そんな大きなキーワードで対策をしてはいけません。
広告費用が高くなる本当の理由とは?
売れないサイトに集めていませんか?広告費用がかかるわりには
お問い合わせが少ない・・・と感じる方は多いはずです。
購入率の悪いサイトに集客をしている可能性があります。