• ベストアンサー

DBの「非正規化」について

どうしても答えが出てこないため、質問させてください。 先日、DB構成表を上長へ渡したところ、「設計が完全に完了して からパフォーマンスを考慮して非正規化をする事を考えるように」 と構成表も見ずに言われました。 ここで指す「非正規化」とは、何を指すのでしょうか? ご教示いただけますと幸いです。

  • MySQL
  • 回答数2
  • ありがとう数11

質問者が選んだベストアンサー

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.2

 正規化の意味・意義・必要性はちゃんと理解しておられますね?  テーブルを正規化するには、テーブルを分割することになります。  その結果、データを利用する時には、分割したテーブルを結合する必要が生じます。当然、テーブルを結合するには、コストがかかります。CPU・IO時間であったりメモリー領域であったりです。  もし、業務システムにおいて、非常に頻繁に同じ形で結合してデータを利用しなければならないのであれば、結合にかかるコストが無視できなくなる時が往々にしてあります。例えば、必要な時間内に結果が帰ってこないとかそういう形で現れます。  その時に、初めて、非正規化の事を検討します。  正規化することによって得られた、データの整合性・データの重複の排除などなどの利益と結合によって損なわれる効率の問題を天秤にかけて、正規化のために分割したテーブルを結合した形のひとつのテーブルの形で再構成します。  これが、非正規化の作業です。  が・・・・往々にして、あなたの質問にある上司の発言は、「テーブルを分割すると効率が悪くなるから最初から正規化作業なんてしちゃいけないんだよ。」とか「テーブルを分割したら、使う時にまた結合しなきゃいけない。面倒なだけじゃないか。最初から一つのテーブルなら何の苦労もないのに」という間違った設計方針を戒めるために使われることが多いです。  最後に、もう一度、問いかけておきます。  非正規化するためには、正規化した場合のコスト上のデメリットと非正規化をした時のコスト上のメリットを比較する必要があります。  正規化の意味・意義・必要性はちゃんと理解しておられますね?

ajtchf
質問者

お礼

なるほど。 テーブルを分割することにより柔軟性は向上しますが、 コストはかかりますね。 そのための非正規化ということですね。 私は今まで、どちらかというと、どんな要求にも耐えら れるような拡張性を大事に考えてきたほうなので、 正規化に重点を置いてきたほうだと思ってます。 見た目も綺麗でそれが正しいと思っていたからです。 そこに負荷という考え方はなかったように思えます。 自分の常識が変わりました。 この場をお借りし御礼申し上げます。

その他の回答 (1)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

個人IDがあり、住所情報を正規化するとしましょう。 項目は「郵便番号」「都道府県」「市区町村」「番地」「電話番号」「メールアドレス」としますよ。 (まとめて全項目使用する) 「厳密」に攻めていくと 個人IDを主キーとする「郵便番号テーブル」を作る。 個人IDを主キーとする「都道府県テーブル」を作る。 個人IDを主キーとする「市区町村テーブル」を作る。 個人IDを主キーとする「番地テーブル」を作る。 個人IDを主キーとする「電話番号テーブル」を作る。 個人IDを主キーとする「メールアドレステーブル」を作る。 で、それぞれをアクセス、面倒ですよね。 だったら非正規化して個人IDを主キーとする「住所情報テーブル」で良いじゃないですか。 では?

ajtchf
質問者

お礼

具体的な例をあげていただき、大変わかりやすかったです。 なんでもかんでも分ければいいってもんじゃないですもんね。 本当に有難うございました。

関連するQ&A

  • 正規分布

    正規分布を勉強し始めたところです。 いくつか問題をやってみたのですが模範解答と答えが合わない、私の分布表の見方が正しいかどうか自信が無い、で困っています。 質問1) 問題→ Given that X~N(20,16), find: P(17≤ X ≤ 27) 回答 → 0.7333 私の出した答え → 0.6865 模範解答の途中式も(0.9599 – (1 – 0.7734)で 私は間違っていると思うのです。私は(1-0.7734)+(0.9599-0.5)=0.6865 です。 質問2)問題は画像通りです(すみません一番上に写っている =0.7333は関係無いので無視して下さい。 わからないのは下の方に鉛筆で書き込んでいますが 正規分布表から得た数字が私のとは違うのです。 昨日こちらで違う質問をした時 「正規分布表には、バリエーションが ある」というのを初めて知りました。 が、私の使っているのは模範回答者のと同じでP(Z ≦ t) の表です。 ですから私の表の読み方が間違っているのかどうか教えて欲しいのです。 0.714 .....の私の読み方→ まず左端から0.71が 0.7611 それに右端から4 →12 をプラスして 計0.7623になります。(うまく書けなくてすみません) 私の表の読み方は間違っていますか? 質問3)質問1の問題では ≤  質問2の問題では <  を使っています。 この違いはこの場合考慮しなくていいのですか? 模範解答では配慮していないのですが... 質問が多くてすみません、どうぞ宜しくお願い致します。

  • 入力値の正規化を行うタイミング

    下記の通り、データ入力用のフロントエンド(html)、DB向けのクエリ発行用スクリプト(PHP)、 データベース(MySQL)で構成されたWebアプリケーションがあるとします。 index.html <データを入力>   ↓ insert.php <DBへクエリ発行>   ↓ DB <クエリに従って値をinsert> index.html上のフォームに入力された文字列をDBに挿入するという主旨です。 この時、文字列に半角/全角スペースが含まれる場合は、半角/全角スペースを排除して DBに挿入するとします。 半角/全角スペースを排除した旨の通知はしません。 このような値の正規化はどのタイミングで行うのがベストでしょうか? 正規化を行うチャンスはすべての段階で存在すると理解しています。 ・index.html   Javascriptにて、submitする前に値を正規化してPHPへ渡す。    → Javascriptが無効化されていると不可      (しかし、今時Javascriptを無効化するユーザがいるだろうか)。 ・insert.php   ここで正規化してDBへ渡す。    → 経験上、これが一般的と感じる。 ・DB   ストアドプロシージャ等を用いて、正規化した値を挿入する。    → 最近MySQLでプログラミングのようなことが出来ることを知り、ここで正規化するのも      アリではないかと考えた次第。 メンテナンス性やパフォーマンスなど、様々な観点からご意見を頂けると幸いです。

  • DBスペシャリストとは

    皆さんが考えるDBスペシャリスト像を教えてください。 ちなみに、自分の中のDBスペシャリストとは、 (1)副問合せ、リンクを使用したSQL文を問題無く作成できる。 (2)スピードを意識したSQL文を作成できる。 (3)正規化により、性能、見易さを意識したテーブル設計ができる。 (4)ネットワークの知識が強い。 (5)(例えば)Oracleのメンテナンスができる。 というものです。 上記の他にこんな事もあるのではないか。という意見があれば教えて下さい。 ※否定的な意見はご遠慮願います。

  • DB設計に要する見積もりについて

    新規のシステムで、全体の見積もりを行う中で、DBだけに注目して容量の算出、テーブル作成、正規化等プログラミングする前にいろいろやる事があると思いますが、その部分だけの作成にはどのような情報があれば、工数を算出できるのでしょうか? 勿論、テーブルの数や名前、その中の項目数や項目名、収まるデータ量なんか はDB作成以前の設計段階での工数見積もりに入ってくると思うので、ここでは DB見積もりから除外して考えております。 宜しくお願い致します。

  • DB(データベース)のバックアップについて[Postgres]

    いつもお世話になっています。 今回質問させて頂きたいことはDBのバックアップについて、です。 現在の私のサーバの構成は WEBサーバ - DBサーバ となっています。 ちなみにDBのソフトはPostgreSQLです これをWEBサーバ - DBサーバ - DBバックアップサーバ といった構成にしたいのです。 googleで調べましたところ PGCluster PGpool Slony-I といったツールを使用することで実現出来そうなのですが レプリケーション、フェイルオーバといった機能を 使用することを前提にしているようで、端的に言えば、「高機能すぎる」のです。 pgpoolというツールは WEBサーバ - pgpool- DBサーバ(マスタ)        │        DBバックアップサーバ(スレーブ) といった構成にすることで、DBサーバ(マスタ)が落ちても自動的にスレーブに切り替える といったことが実現出来るようです。 しかしこれはDBサーバの構成を切り替えることになるので、相応の能力が必要である、 といった印象を私は受けました。正直言って業務の基幹を担うDBサーバの構成を変える勇気は 私にはありません。 しかし現構成では DBサーバが物理的に壊れてしまった場合等、不安があり過ぎる状態なので DBサーバの構成は極力変更せず、DBバックアップサーバにレプリカを「保管」出来る ようなツールを探しています。 いざという時のための保険ですので、完全なレプリカでなくても良いと思っています。 よろしくご教示のほどお願い致します。

  • .NET FrameworkのDB操作について

    .NET FrameworkのDB操作について以下のアクセス方法があるかと思います。 ADO.NET SqlClient ADO.NET DataSet EntityFramework Dapper SqlClientを良く業務で使ってましたが、sqlcommandbuilderを使えば更新系クエリ(Insert、Update、Delete)を書かなくてもクエリを自動生成してくれるので、開発が楽になる印象です。パフォーマンスが良くないと一部サイトでは書かれていたりしますが、私はさほどパフォーマンスが悪いとは思えません。10万件以下のテキスト取り込みも3分もかからなかった記憶があります。(定かではないです。) 次にDataSetですが、これは使った事がありません。 EntityFrameworkは最近使いましたが、更新系クエリを自前で書かなければならず(自分が使いこなせていないだけかもです。)パフォーマンスもあまり良くありませんでした。※くどいようですが、全てを知ってるわけではないので、使い方が悪い等あればご指摘いただきたく。。。 最後にDapperも使った事がありません。 この4つの中で何が良いのかが、いまいち決めかねています。というのも自分が全てを完璧に理解できているわけではないからです。 何を重視するのかにもよりますが、パフォーマンスが一番で次に開発コストかと思います。やはりパフォーマンスが悪ければ使いづらいシステムの烙印を押されてしまいます。 長くなりましたが、DB操作には何を使用するのがベストでしょうか。それぞれのメリット、デメリットも添えてご回答いただけますと幸いです。

  • DBサーバーの構成について

    DBサーバーの構成について悩んでおります。 個人事業を営んでおりますが、クライアントサーバ型のハード、ソフトの購入に当たり、業者からの見積もり内容がよく分かっておりません。 CPU:Xeon X3360 HDD:SAS 292Gアレイ(146GB15,000r/m×3 RAID5) メモリ:4GB DBサーバーのみで使うようですが、OSのライセンスの関係もあり、最大で5人が同時に利用する程度です。 主要テーブルは年間を通して200万行程度増加します。 業務に支障が無いレスポンス(5秒以内)を考慮して、構成内容は妥当なものでしょうか? 5年も経てば、買い替えになるかと考えていますので、その程度維持出来れば良いかと考えております。 参考となるような情報を頂ければ幸いです。 宜しくお願い致します。

  • 正規化について

    こんばんは。お世話になっております。 現在、テーブルの設計を考えているのですが、「正規化」に関してアドバイスを頂ければと思い、投函させて頂きました。 例えば、ログイン情報に関する、id,mail,passwd,name1,name2,address,category などといった項目を格納させたいと思っているのですが、正規化を調べていると、更に細分化して登録させるべき・・などといった事が書かれていました。 当然、分散させるとスクリプト的にバグを誘発する可能性も出てくるかと思うのですが、データを参照する際、複数のテーブルに接続する負荷?を踏まえ、今回のような個人情報に関するものでも、分散して登録した方が良いのでしょうか? 有識者の貴重なご意見を頂戴出来れば幸いです。 お忙しい中恐縮ですが、宜しくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • 正規表現について教えてください。

    正規表現について教えてください。 Oracleで開発を行っている者ですが、ネットや本で調べても わからない箇所がありましたので、ここに質問として挙げさせていただきます。 ご教示いただけると幸いです。 現在、下記のようなデータが入ったテーブルがあります。 ---------------------------------------------------------------------------------- ID | SENTENCE          | REG_EXP ---------------------------------------------------------------------------------- 1 | <○○○:XXXX>      | [^<][^:]+ ---------------------------------------------------------------------------------- 2 | <○○○:XXXX>→<△△△:XXXX> | ---------------------------------------------------------------------------------- 3 | ■■■■■<○○○:XXXX> | ---------------------------------------------------------------------------------- このテーブルを使って、アプリを作っているのですが、 期待動作としては、SENTENCEの列に入っている文字列を REG_EXPの列に入っているデータ(正規表現のパターン)で マッチした文字列を切り取るようにしたいのです。 例えば、IDが1の場合は○○○が切り取られるのが期待動作です。 (注.この動作は、REGEXP_SUBSTR関数を用いてSQLで実行します。) お聞きしたいのは、IDが2の場合は△△△を、IDが3の場合は○○○を、 配列の最初の要素に入れるには、正規表現をどのように記載すればよいのか、ということです。 ○、△、■、Xの部分は英数字、日本語のどれが入るのかはわかりませんが、 <や→、:などの全角記号のフォーマットはこのままになります。。 IDが2の正規表現は[^<:→]+[^<:→]+[^<:→]+ で試してみたのですが、 うまく出来ませんでした・・・。 テーブルの線の調整がうまくできず、 表が見づらくて申し訳ありませんが、 正規表現に詳しい方、ご教示をよろしくお願いいたします。

  • db2setupでdb2inst1が作成されない

    お世話になります。 redhat9にDB2ver8を導入しようとしています。 db2setupを実行しGUIインストールを行いました。 しかし、セットアップ完了画面でなぜかdb2inst1だけ作成されておらず、db2start等のコマンドができません。新しくdb2inst1とdb2grpを作成して、再度インストールを実行してもうまくいきません。 色々調べてみたのですが、いまいちよい事例が見つからないので、質問させていただきますので、よろしくお願いします。 以下に失敗していると思われるログを抜粋します。 DB2 ファイル・セットのインストール:.......成功 DB2 ライセンスの登録:.......成功 デフォルト・グローバル・プロファイル・レジストリー変数の設定:.......成功 DB2 Administration Server の作成:.......成功 エラー:現在の DB2INSTANCE を "db2inst1" に切り替えることができませんでした。戻りコードは "-2029059916" です。 インスタンス・リストの初期化:.......成功 DB2 インスタンス構成のカスタマイズ:.......成功 エラー:DBI1131E ユーザー ID db2inst1 が無効です。 説明: 与えられたユーザー ID にアクセスしようとして失敗しました。 次の状態のいずれかが発生していると考えられます。 o このユーザー ID がシステムにない。 o このユーザーのホーム・ディレクトリーが正しく設定されていない。 o DB2 で必要なユーザー属性のいずれかが設定されていない。 o このユーザーの UID が 0 である。