🦝

正規化と非正規化

2021/08/23に公開

現時点での理解を文章化しておく。

正規化とは

正規化とは、データベースで保持するデータの冗長性を維持し、一貫性と効率性を保持するためのデータ形式。

第一正規化

第一正規化の定義は「一つのセルの中には一つの値しか含まない」
スカラ値の原則。scalarは「単一の」の意味。

第二正規化

第二正規化の定義は「部分関数従属の解消」
主キーの一部の列に対して従属する列がある場合、この関係を「部分関数従属」と呼ぶ。
これに対して、主キーを構成するすべての列に従属性がある場合を、完全関数従属と呼ぶ。
第二正規化とは、テーブル内で部分関数従属を解消し、完全関数従属のみのテーブルを作ること。

社員テーブルにおいて、
主キーである「会社コード」「社員ID」が存在する場合、
「会社コード」カラムに従属する「会社名」カラムが部分関数従属となる。

これが存在する場合、「社員の有無が不明な会社」「会社情報が不明な社員」を登録することが出来なくなる。

正規化は、現実世界の実体間にある海藻の差を反映する手段でもある。

第三正規化

推移的関数従属(テーブル内部に存在する段階的な従属関係)の解消
(このあたりから理解が曖昧。非キー列に対する従属のことか?)

第四正規化

独立な多値従属性が複数存在するテーブルを分割すること

第五正規化

関連がある場合は、それに対応する関連エンティティを作ること

正規化の3つのポイント

1.正規かとは更新時の不都合・不整合を排除するために行う
2.正規化は従属性を見抜くことで可能となる
3.正規化はいつでも非正規形に戻せる

正規化は常にするべきか?

・第三正規化までは原則として行う。
・関連エンティティが存在する場合は関連とエンティティが1対1に対応するよう注意する

正規化の欠点

・テーブルの数が増えるため、SQL文で結合を多様することになり、パフォーマンスが悪化する
この欠点はしばしば無視できないため、あえて非正規化することがある

非正規化

正規化することはデータベースにおけるテーブル設計の基礎だが、時としてSQLのパフォーマンス問題を引き起こす。
この問題への対処は2つ。SQLのチューニングと、非正規化。

SQLにより値を結合しなければ出てこない値について、「事前に結合した値」を用意しておけば、以後はその「事前に結合した値」をSELECTすることでパフォーマンスを改善させることができる。

非正規化の欠点

1.非正規化は、検索のパフォーマンスは向上させるが、更新のパフォーマンスを低下させる
2.データのリアルタイム性を低下させる
3.後続の工程で設計変更すると、手戻りが大きい。(正規化⇒非正規化、非正規化⇒正規化どちらも)

非正規化によりパフォーマンスは改善されるが、データの冗長性は失われるため、チューニングで問題が解決しない場合の最後の手段として考える。

Discussion