skillup

技術ブログ

Database

第二、第三の正規化&ER図&Check制約

投稿日:

前回第一正規化を話したので、第二、第三に進んでいきます。

第二正規化とは?

  • 主キーに対してすべての列が関数従属していること。この状態を完全関数従属という。
  • 正規化されていないテーブルとは例えばマスタの値そのものが入っているようなケース。
  • 正規化のメリットとしてはデータの不整合が起こらないこと
  • 概念としては現実世界の実体間にある階層の差を反映する手段であること
  • 戻すときには結合(JOIN)を用いること。戻せる性質を可逆性という。逆に言えば戻せないときには正規化が失敗している。

第三正規化とは?

  • 主キー以外のマスタなどの値にたいしても従属性を持たせること。
  • このようにテーブル内部に存在する段階的な従属関係を、推移的関数従属という。
  • 一般的な正規化はこの第三正規化までをすることが多い。

正規化のメリット

  • 更新時の不都合・不整合を排除すること
  • 正規化は従属性(キーと値の1対1対応)を見抜くことで可能になる。
  • 正規形は常に非正規形に戻せる。この性質を無損失分解という。

ER図

実際の業務ではかなり小規模なアプリでもテーブルが2桁になることはめずらしくありません。中規模なもので数十、ちょっと大きなものになると数百となるでしょう。このようにテーブルが増えたときにテーブル同士の関連をみるときに、ER図があると視覚的にテーブル同士の関連をすぐに把握することができます。

ER図サンプル

http://www.rich.co.jp/blog/tech/16012501

正規化に関しては一件当たり前のことをいっていますが、関数従属しているかどうかは複雑なテーブルになってくるとあいまいになることは珍しくありません。

特にキーにidを使うのではなく、コードなどを入れる場合、ユーザーが自由にいれるので複雑になってきます。ここら辺は関数従属性を1つ1つ確かめながらテーブル分割をやっていきたいところですね・・・

本日のSQLネタ Check制約

check制約について。

自分はあまり使ったことがなかったんですが、テーブルのレコードに制約を付けたいときに使います。

SQLパズル第一問より

ある年度の会計開始日と終了日のテーブルを作るさい、制約を付けます。

例えばn年度の場合その年の10/1~次年度の9/30になります。そのためのテーブルの定義にcheckを使います。

constraint チェック名 check( チェック内容 ) です。

ただしMySQLではサポートされていません・・・

-Database
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

CASE式のすすめ

SQL実践入門を7割がたぐらい終えたところで同著者の方の「達人に学ぶSQL徹底指南書」を学習しようと思っています。 この方の著書は気づいたら結構読んでましたね。 Contents1 CASE式での注意 …

no image

サブクエリ 移動平均など

前回の応用編です。 日付、入出金、残高はできましたが、ここからさらに、現在のレコードから3行以内(3行あれば3行、なければそれ以内でできるだけ)のレコードの合計値を出す計算を考えます。 結果だけ先に書 …

no image

リレーションを含んだテーブルでの副問い合わせ

本日はSQLネタです。 下記のようなテーブル構成があったときとします。 注文ヘッダと注文詳細は(1:N)とします。 ここで、product_id=5を含んだ注文ヘッダーレコードを取り出したいとします。 …

no image

MySQL.sockファイルに関して

朝出社してテストサーバーを見るといきなりサーバーが動いていないという事態が発生。 MySQLを起動しようとすると

なるメッセージがでて …

no image

SQL サブクエリ

前回の問題をサブクエリを使って解きます。前年度の売上を出すのが一番難しいので、それを出す方法です。MySQLだとそもそも分析関数が存在しないので・・ [crayon-5a9132f50f00a8939 …