1. まとめトップ
1 お気に入り 8110 view
お気に入り追加

この記事は私がまとめました

hilaponさん

正規化って難しいですよね。「理論から学ぶデータベース実践入門」読んでて、リレーショナルモデルや論理学より難しく感じるのは気のせいなのか、それとも私が頭が悪いせいか・・・多分後者なのだと思います (汗)。そこで独学用に、正規化について少しまとめたいと思いました。

正規化の概要

正規化の概要について調べてみました。正規化について論じてるサイトは多いですが、多くは正規化の種類の解説のみであり、正規化の概念そのものや必要性について解説してるページは少ないように思います。
まず wiki を引用します。ここは比較的概要がまとまってると思う。

リレーションの正規化

リレーションの正規化は、関係データベース (リレーショナル・データベース) において、正規形と呼ばれる形式に関係 (リレーション) を準拠させることにより、データの一貫性の維持と効率的なデータアクセスを可能にするリレーション設計を導くための方法である。・・・・正規化を行うことにより、データの冗長性と不整合が起きる機会を減らすことができる。

正規化は必要か

正規化について調べると、メリットデメリット賛否両論ですね。かくいう私もつい最近まで正規化反対派でした。まず、とりあえず検索して目に付いた反対意見を挙げてみます。

世の経験値が浅いかコスト意識の低いエンジニアの中には、"正規化すべし"ということを教科書通り真に受けて、費用対効果の低い正規化とテーブル増加を安易に行ってしまう方がいるようです。・・・・正規化とはコストと付加価値を十分見極めて設計する必要があり、つまり"ビジネス要件"でもあるのです。

正規化はコストがかかるため、本来すべきではないと言っているようだ

物理データベースについて言えば非正規化も「許す」ではなく、非正規化こそ「正しい」と言える。このことを実例を挙げて証明し、これまでの議論に決着をつける。

「決着をつける」(キリッ と言い切ってるしー!

・・・・正規化(非正規化)すると早く(遅く)なる、という命題の立て方はどうかと思うのですけどね。

単純さ、理解のしやすさという点でも、テーブルの結合操作というのは、結構嫌われるのですよ。データベースの 正規化 vs 非正規化 というのは、オブジェクト指向でいう、小クラス主義 vs 大クラス主義 に通じるものがあるんじゃないですかね。

以上は一見もっともらしい意見だが、SQLアンチパターンではこれらの意見を一刀両断にしている。以下、見出しだけ引用させて頂いたが、詳細はぜひ実際に本を手にとって一読して欲しい。

正規化の神話

極めて正確な定義がありながら、これほど誤解されてるテーマもないかもしれません。正規化について、以下のような誤解を自信たっぷりに語る開発者は、石を投げれば当たるほど多くいます。

正規化はよりデータベースを遅くする。非正規化をすればデータベースは速くなる

これは間違いです。(以下略)

正規化とはデータを子テーブルに追い出し、擬似キーを用いて参照することである

これも間違いです。(以下略)

正規化とはEAV設計のように、できる限り属性を切り離すことだ

違います。(以下略)

第4正規形以上の正規化をする必要はない。第3正規形以外の正規形は難解であり、それが必要になる場面には出会わないであろう

誤りです。(以下略)

どこまで正規化すべきか

なぜ人は正規化を蔑ろにするのか。そのことについて近年私の中でひとつの大きな発見があった。「正しいデータベース設計をするぞ!」と意欲的に取り組んだとしても、多くの人が挫折を経験するようになる罠が、リレーショナルデータベースには存在するのである。それは、「全てのテーブルを正規化できるわけではない」という点である。言い換えると、テーブルには正規化できるものと出来ないものがあるということだ。

正規形の種類

第一正規形

第一正規形の条件は、テーブルがリレーションの性質を満たすこと。何故ならば、正規化はリレーショナルモデル上での設計理論なので、リレーションにしか適用できないから。だからNULLを含んではいけないし、繰り返しグループは許容されず、ドメインの設計がしっかりできていないといけない。

スカラ値について

wikiの正規化の解説によれば、関係がスカラ値のみを持ちうるとき、そのリレーションを第1正規形 (first normal form; 1NF) であるといってます。ところが、奥野さんの本だと、第1正規形とはずばり「リレーションであること」だと断言してます。また「スカラ値」という言葉はよろしくないとも言われてますね。

スカラであることとアトミックであることは別の概念です。混同しないように注意しましょう。それ以前にアトミックであるという定義すらあいまいですので、ドメインを前提とした設計をこころがけましょう。

P76、Column:「列の値はスカラであるべき?」より引用

「おうちで学べるデータベースのきほん」の正規形の解説にマジツッコミしようか悩む。

とりあえず、「スカラ値」っていう単語を使って解説するのは止めたほうがいいと思う。あと、P.265の表9は1NFじゃあない。

関数従属性

1 2