skillup

技術ブログ

Database

正規化のデメリット

投稿日:2016年7月26日 更新日:

正規化のデメリット

正規化についていろいろ書いてきましたが、メリットもあればデメリットもあります。

メリットとしては

  • データの不整合が起きにくい
  • 更新時の処理が速い

ことなどがあげられるでしょう。

逆にデメリットもあります。

それは「結合により検索系のSQLが遅くなること」です。

このため、わざと非正規化したテーブル設計をすることもあるようです。

一般論としては正規化の次数があがるほど、検索スピードは落ちる傾向にあるようです。

ただそうはいっても「データの不整合は絶対に防がなくてはいけないこと」から非正規化は最終手段と考えられているようですね。

この点は私の経験からも一致しますね。基本的に今までテーブルは正規化されたものが基本で、非正規化されたものというのはほとんど見たことがありませんでしたので。

更新速度を上げるためのポイントはいろいろとありますが、その1つがサマリーデータの格納です。

例えば受注テーブルと受注詳細テーブルがあったとし、受注テーブルのカラムが受注ID,注文日、注文者、受注詳細テーブルには受注ID、明細連番、商品名があったとします。

ここで商品の売り上げや個数を知りたい場合、基本的に受注テーブルに受注詳細テーブルをJOINして持ってきます。

ここでスピードのボトルネックが発生するわけですが、もし商品数という情報を受注テーブルに加えると

  • 厳密な第三正規化ではなくなる
  • 更新時における問題が起こる可能性がある(データの不整合が起きる可能性がある)
  • 更新時の処理は逆に負荷がかかる

半面、

  • 検索処理が非常に簡単でハイパフォーマンス

になります。

その他、日ごとの注文情報を出したいなどといったときには受注詳細に受注日をいれておくことで日ごとの一覧情報を出したい、となったときにも高速な検索処理を行うことができるのです。

このように正規化を崩すことでパフォーマンスを上げることは可能です。ただ、機械的にできるものではないことやデータの不整合が起こる可能性があるため、慎重に行う必要があります。

またデータベースの変更はプログラムの変更に比べて厄介なことが多いため、後戻りが簡単にできません。この点でも慎重に行う必要があります。

本日のSQL

n日前やn時間前を出すときにSQLでシンプルにできる方法を知りませんでした(汗)

例えば今の時間の3日前は下記のように簡単にできます。

例えば1年以内の注文(order)を出したいといった場合、注文日(order_date)に下記のように検索条件を付けてあげればOKです。

[ MySQL ] n分前, n時間前, n日後の日付を取得する ( INTERVAL )

-Database
-

執筆者:


comment

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

関連記事

no image

データベース設計のアンチパターン リトライ+バッチ分割+バッチの再利用不可

Contents1 リトライ1.1 デメリット1.2 対策2 バッチ分割2.1 デメリット2.2 対策3 バッチ再利用不可3.1 デメリット3.2 対策 リトライ ※OLTP=オンライントランザクショ …

no image

大規模Webサービス技術入門 DBの分散

前回に引き続き、大規模サービスを運用するときに必要になるMySQLの知識についてのまとめ Contents1 テーブル・SQL設計2 レプリケーション機能3 パーティショニング テーブル・SQL設計 …

no image

JPQLでの算術関数

複雑なJPQLを書いていると、通常のレコードの取り出しだけではなく、合計(SUM)や算出(COUNT)などのいわゆる算術関数を使うことが一般的です。 JPQLでもこれらを通常通り扱うことができます。 …

no image

O/Rマッパー iciqlについて

以前、このブログでも紹介したO/Rマッパーのiciqlについて、使い方や問題点がある程度わかったので書いておきます。 Contents1 インストール2 自動生成3 注意点3.1 Date型のインポー …

no image

netbeansのJPQL補助機能

JPAでは基本的に生のSQLではなく、JPQLを使って書きます。 SQLでもタイプミスにイライラさせられることは多いのですが、JPQLはもっとですね・・・爆 そこで使えるのがNetbeansの入力補助 …

アーカイブ