- ベストアンサー
DBの「非正規化」について
どうしても答えが出てこないため、質問させてください。 先日、DB構成表を上長へ渡したところ、「設計が完全に完了して からパフォーマンスを考慮して非正規化をする事を考えるように」 と構成表も見ずに言われました。 ここで指す「非正規化」とは、何を指すのでしょうか? ご教示いただけますと幸いです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
正規化の意味・意義・必要性はちゃんと理解しておられますね? テーブルを正規化するには、テーブルを分割することになります。 その結果、データを利用する時には、分割したテーブルを結合する必要が生じます。当然、テーブルを結合するには、コストがかかります。CPU・IO時間であったりメモリー領域であったりです。 もし、業務システムにおいて、非常に頻繁に同じ形で結合してデータを利用しなければならないのであれば、結合にかかるコストが無視できなくなる時が往々にしてあります。例えば、必要な時間内に結果が帰ってこないとかそういう形で現れます。 その時に、初めて、非正規化の事を検討します。 正規化することによって得られた、データの整合性・データの重複の排除などなどの利益と結合によって損なわれる効率の問題を天秤にかけて、正規化のために分割したテーブルを結合した形のひとつのテーブルの形で再構成します。 これが、非正規化の作業です。 が・・・・往々にして、あなたの質問にある上司の発言は、「テーブルを分割すると効率が悪くなるから最初から正規化作業なんてしちゃいけないんだよ。」とか「テーブルを分割したら、使う時にまた結合しなきゃいけない。面倒なだけじゃないか。最初から一つのテーブルなら何の苦労もないのに」という間違った設計方針を戒めるために使われることが多いです。 最後に、もう一度、問いかけておきます。 非正規化するためには、正規化した場合のコスト上のデメリットと非正規化をした時のコスト上のメリットを比較する必要があります。 正規化の意味・意義・必要性はちゃんと理解しておられますね?
その他の回答 (1)
- bin-chan
- ベストアンサー率33% (1403/4213)
個人IDがあり、住所情報を正規化するとしましょう。 項目は「郵便番号」「都道府県」「市区町村」「番地」「電話番号」「メールアドレス」としますよ。 (まとめて全項目使用する) 「厳密」に攻めていくと 個人IDを主キーとする「郵便番号テーブル」を作る。 個人IDを主キーとする「都道府県テーブル」を作る。 個人IDを主キーとする「市区町村テーブル」を作る。 個人IDを主キーとする「番地テーブル」を作る。 個人IDを主キーとする「電話番号テーブル」を作る。 個人IDを主キーとする「メールアドレステーブル」を作る。 で、それぞれをアクセス、面倒ですよね。 だったら非正規化して個人IDを主キーとする「住所情報テーブル」で良いじゃないですか。 では?
お礼
具体的な例をあげていただき、大変わかりやすかったです。 なんでもかんでも分ければいいってもんじゃないですもんね。 本当に有難うございました。
お礼
なるほど。 テーブルを分割することにより柔軟性は向上しますが、 コストはかかりますね。 そのための非正規化ということですね。 私は今まで、どちらかというと、どんな要求にも耐えら れるような拡張性を大事に考えてきたほうなので、 正規化に重点を置いてきたほうだと思ってます。 見た目も綺麗でそれが正しいと思っていたからです。 そこに負荷という考え方はなかったように思えます。 自分の常識が変わりました。 この場をお借りし御礼申し上げます。