読者です 読者をやめる 読者になる 読者になる

ほろ酔い開発日誌

有意義な技術的Tipsを共有出来たら嬉しいです。Ruby、Railsが好きです。Web開発全般(Rails多め、フロント、サーバー、インフラ)、データ分析、機械学習あたりの記事が中心になる予定です。

Rails使うときほとんど正規化考えないよね

Rails RDB

正規化とはRDBにおいてデータを適切に管理するための手順です。

正規化

まずはさらっと正規化を考えます。 正規化は以下の手順で行っていきます。

  • 第一正規化
  • 第二正規化
  • 第三正規化
  • ボイスコッド正規化
  • 第四正規化
  • 第五正規化

第一正規化

  • 同一の内容の行が複数存在することはない
  • 候補キーが存在する

候補キー

特定の行を識別することの出来る項目を候補キーといいます。「候補」というのは主キーとなる候補という意味合い。主キーは候補キーの条件+「null値を持たない」という条件がつきます。

第一正規化は普通にすれば普通に出来るはずです笑 表で考えた時にひとつのセルに3つ項目入っているとか変なことをしなければ大体できてると思います。

第二正規化

  • キーに対する部分関数従属がない

キーの一部が決まることで一意に決まる非キー属性がないというと分かりやすいかと思います。 キーは複数あることがあります。以下の様な項目を持つテーブルを考えるときitem_idとorder_idがキーであるとします。

  • item_id
  • order_id
  • name
  • price

このときitem_idが決まれば name、priceは一意に決まっていまいます。これはもうひとつのキーであるorder_idとは関係なく決まります。item_idとorder_idの2つが決まってはじめて他の項目が決まることを完全関数従属といい、例のようにキーの一部で他の項目が決まってしまうことを部分関数従属であるといいます。

第二正規化ではこの部分関数従属を別テーブルに分解して部分関数従属をなくします。

第三正規化

  • 非キー属性の関数従属をなくす

Booksテーブルがあったとしてtitleをキーとします。

  • title
  • writer_name
  • writer_birth_day

writer_nameが決まればwriter_birth_dayが一意に決まります。これが非キー属性での関数従属です。 なのでこの部分を別テーブルに分けることが第三正規化となります。

ボイスコッド正規化

ボイスコッド正規化以下は簡潔に。 ボイスコッド正規化までくると、主キー同士の関数従属も排除します。

第四正規化

第四正規化と第五正規化は非キー属性をもたないキー属性のみのテーブルにのみ適用します。

多値従属性を考える必要があります。 対称性のある多値従属性を分解します。

第五正規化

対称性のない場合の多値従属性も考えます。

第四正規化と第五正規化は以下がわかりやすいので参照下さい。 http://www.atmarkit.co.jp/ait/articles/0605/11/news124_4.html

Railsの正規化

Railsはテーブルを設計するときに、「id」というキーが単独のprimary keyとなります。第一正規化はまあ普通にやれば出来ているとして、キーが単独なので第二正規化、ボイスコッド正規化、第四正規化、第五正規化は考える必要がなくなり、第三正規化だけ考えればよさそうです。 「id」を使うようになった背景や詳しい理由は気になるところなので参照記事や書籍を是非ご紹介頂きたいです。