データベース設計のための効率的な検索方法とは?

このQ&Aのポイント
  • データベース設計において、ユーザマスタの検索方法について悩んでいます。ユーザマスタには個人と企業のデータが入りますが、企業だけを検索したい要件があります。検索方法として、「企業フラグ」をつけた検索と代表者名の有無で検索する方法が考えられますが、どちらの方法が効率的なのか悩んでいます。
  • (1)「企業フラグ」をつけた検索では、余分なカラムを持つことになるかもしれませんが、気分的には速いのではないかと感じます。(2)代表者名の有無で検索する方法は、カラムを持たず、値の有無で検索できますが、速度面で劣る可能性もあります。検索の効率を考えると、どちらの方法が適しているのでしょうか。
  • データベースの設計において、ユーザマスタの効率的な検索方法について悩んでいます。データベースには個人と企業のデータが入りますが、企業だけを検索する際の方法がわかりません。企業フラグと代表者名の有無で検索する方法が考えられますが、どちらの方法がベストなのでしょうか。カラムの余分さと検索速度を考慮して、最適な方法を教えてください。
回答を見る
  • ベストアンサー

データベースの設計をしています。

データベースの設計をしています。 ユーザマスタというテーブルがあり、 その中には、個人または企業のデータが入ります。 マスタ登録時に個人と企業は微妙に必須項目が違います。 (例えば、企業の場合は代表者名が入る、など) 要件としては、「企業だけを検索したい」というものもあります。 ここで質問なのですが、 (1)ユーザマスタに「企業フラグ」をつけて、それが「1」のものと検索する (2)代表者名に値が入っているものを検索する この場合、(1)と(2)ではどちらが検索が速いのでしょうか。 (1)の方が、気分的に(なんとなく、です)速い気がするのですが、 (1)だと、余分にカラムを持つことになり、もし(1)も(2)も同じ速さOR(2)の方が速い場合には 無駄だなあ、と思って困っております。 どなたかお詳しい方がいらっしゃいましたら、 どうぞよろしくお願い致します。

  • MySQL
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
回答No.2

はじめまして、通りすがりと申します。 さて、ご質問の件なのですが、比較だけの速度の質問でしたら当然比較する項目の長さに依存しますので フラグにて抽出するほうが早いということになります。 但し、フラグによる切り分けが最良の方法かは言えません。 設計の考え方にはいろいろとありますが(個人レベルでその業務をどう捉えるか..) それにより、性能重視なのか、メンテナンス重視なのか、開発のし易さなのか、その割合をどのように 考えるのかなどにより指針が変動してくると思います。 では、フラグ一つ追加し一つのテーブルに二つの要素(個人/企業)があることによりどのような影響が 出てくるのかが全体的にどのような影響を与えるのか..なども検討しなければなりません。 たとえば、個人1800万件、企業 800万件の対象データがあると過程します。 この場合、ご質問の設計方針では2600万件のデータを毎回フラグを参照することになります。 回答者1さんの案はどうでしょうか? 個人を参照した場合、個人は1800万件 企業を参照した場合 800万件参照することになりアクセスは回答者1さんのほうが断然早く解を得られると思います。 また、テーブルに定義する項目数に関する性能ではどうでしょうか? たとえば、個人情報特有の項目数が、100(全部で130)個、企業特有の項目が100(全部で130 個)、共通の項目が30(括弧内数値)個だとします。この場合、企業/個人の双方を一つとした場合、 230個のテーブルとなります。 (実際には、こんなに項目数ないとか、もっとあるとかあると思います。例として挙げてるだけです) データベースは様々なDMLを解釈するためにその仕組みは項目単位で管理しており、処理対象とする 項目数により性能が大幅に変動してきます。 一つのテーブルに、複数の要素(企業/顧客)を操作するようにすると操作毎に対象外の項目を参照 し必要否かを判断することと思います。このような操作により性能を劣化させることかと思います。 逆に分けた場合はどうでしょうか?。確かに一つのテーブルで管理する項目は約半分になり、前述した ネックも半分になりますが、逆に性能を劣化させることも考えられます。当然テーブルを複数に分ければ、 解を求めるときに、テーブル結合、仮想表などを使用すると思います。この方式に於いても性能劣化たる要素が含まれるかと思います。  これらの事を考慮すると、一概にどちらの考え方(フラグを設けるか、既存項目の内容を比較するか) がより早いかという解は得られないと思います。  それよりも、基本的にデータベースの設計論に基づいて(正規化云々)整理し、次に性能面での検討を 行いフラグを設けるのは妥当か、既存項目の参照は妥当か、若しくは、テーブルを二つに分けるか (回答1)をご検討されては如何でしょうか?

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

単純に言えば、顧客マスターは一つの方がいい。 データの管理がしやすし、スピードもあがります。 また特定の条件に依存する項目がある場合、正規化する方が好ましいです。 ただ正規化もよしあしで、多くのケースでスピードとトレードオフになるので チューニングしながらの設計になると思います

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.1

私なら個人顧客と企業顧客は別テーブルにしたい。 フラグというのはかなり格好が悪いし、代表者名があるから 企業と決めつけるのもなんだか意味が曲解していきそう。

関連するQ&A

  • データーベース設計段階での質問です。

    データーベース設計段階での質問です。 管理しなければならないフラグ項目が100近くあり、そのフラグがよく検索対象になります。ただし、1レコードにつけられるフラグは10個までと決まっています。現在使用中のデータベースでは10個のカラムをつくっていて、そこに対象フラグのIDを列挙しています。 例えば A項目に対して1,20,34,56,78 B項目に対して3,6,11,15,42,78,89 のフラグがたっている場合、 name f0  f1  f2  f3  f4  f5  f6  f7  f8  f9 ------------------------------------------------------ A   1   20  34  56  78  null null null null null B   3   6   11  15  42  78  89  null null null となっています。他に日付などのカラムが5項目ほどあります。 このままだと検索等でややこしいことになるため テーブルを整理したいと思っています。 1.100個のboolean型のカラムを作る 2.ビットフラグ(ビットフィールド)のカラムを4つほど作って、検索時ビット演算する 3.項目名(ID)とフラグNo、だけの2カラムで構成した別テーブルを作ってjoinする 4.文字列としてIDを格納し、フルテキストインデックスをはる などがあると思うのですが、効率のいい設計がいまいちよくわかっていません。 上記の方法以外にも何かいい方法があると思います。 このような場合の、テーブル設計の方法を教えて下さい。

  • データベースの設計について教えてください。

    データベースの設計について教えてください。 基本的な質問ですみません。宜しくお願いいたします。 単純なテーブルで表現しますが、 パターンA、Bのどちらのテーブルで設計するのが良いのでしょうか。 DBはmysqlで5000万件のデータで検索のみのデータベースです。 【前提】 ユーザは複数のメールアドレスを持ちます。 画面から、このユーザのもつメールアドレスを表示させる仕様だとします。 【userマスタ】 (PK)ユーザID   ユーザ名   会社名 <パターンA> 【mailテーブル】 (PK)ユーザID (PK)ユーザメールアドレス   モバイル用アドレス <パターンB>  【mailテーブル】 (PK)ユーザメールアドレス   モバイル用アドレス   ユーザID ←インデックスをはります。

    • ベストアンサー
    • MySQL
  • データベーステーブル設計

    簡単なアプリケーションを作ろうとしています。内容は、レストランのデータベースです。画面には、単純にレストラン名、住所、電話番号、営業時間、評価を表示させたいです。この「評価」は、このアプリケーションを使用する3人のユーザが入力する1~5の値の平均値としたいです(ユーザはメンテナンス画面から1レストランにつき1回まで評価値入力可能)。つまりユーザAが4、ユーザBが5、ユーザCが1を入力した場合、4+5+1/3=3.3を表示します。テーブルを設計した経験がないので教えてほしいのですが、この場合、どのようなテーブルを作れば最もシンプルできれいに出来るのでしょうか。まずレストランテーブルを作成する必要があると思いますが、「評価」があるために1テーブルでは不足だと思います。評価カラムの値はユーザが値を入力すれば変動することになるので、別テーブルを参照させるようにすべきなのでしょうか?評価テーブルというものを考えてみましたが、ユーザ名とレストランIDの複合をプライマリキーとし、評価値カラムをもたせるとしても、どこに平均値を持たせればいいのかわかりません。テーブル設計の模範例を教えて頂けると助かります。宜しくお願いします。

  • データベースのマスタ設計についての質問

    現在データベースの設計を勉強しています。 マスタの設計について疑問があって質問しました。 【1】すべてのマスタデータを統合したテーブルを作成 カラム1:カテゴリID(PK) カラム2:カテゴリCD(PK) カラム3:値 【2】それぞれのカテゴリに応じたテーブルを作成 カラム1:カテゴリCD(PK) カラム2:値 ※私はパターン1の方が、カテゴリの追加等柔軟かなと考えています。 それぞれのパターンの長所・短所を教えてください。

  • データベース設計支援ツール

    いろんなプロジェクトでデータベースの設計を何度かやっていると、似たようなテーブル名やカラム名。 また、似たような定義になってきます。 テーブル定義書などは、Excelなどで管理しているのですが、ツールか何かで管理したいと思っています。 そうすれば、異なるプロジェクトでも共有できますし、生産性の向上に繋がると思っています。 できれば、似たようなテーブル(部門マスタテーブルなど)は自動で作ってくれるくらいが理想ですが・・・。 そのようなツールってありますでしょうか?

  • データベース設計について

    端末毎の ログイン時間を調べる為 postgres 8.15 でデータベースを 作成しようと思うのですがどう考えれば良いか教えてください。 要件 ・端末が150台程ある。 ・主にログイン時間 とログオフ時間を書き込む。 ・一日に何度もログインしたりログオフしたりする。  (365日ログインログオフの度に書き込みがある。) ・ログオンしっぱなしで何週間もログオフしないユーザーもいる。 ・ログイン、ログオフの時間をこのデータベースに書き込むツールは  別途用意できている。 ・後日このデータベースを使い端末毎の利用状況を調べる。(一日の内  何時 間ログインしているか?) こんな感じでよいのでしょうか? 初心者の為オーソドックスな考え方を教えてください。 1.No-オートで振られる用にする 2.端末名-テキスト 3・ログイン時間-日付、時刻型 4.ログオフ時間-日付、時刻型

  • データベースについて(mysql)

    プログラミング経験がほとんどないのですが、最近mysqlに携わり、検索時のSQL文の記述方法で分からないことがあるので誰か教えてください。 【説明】 地域テーブル、県テーブル、町テーブル、住所テーブル、存在管理テーブルの合計5つのテーブルが存在します。 地域テーブルには地域名と地域コードのカラムがあります。 県テーブルには県名と県コードのカラムがあります。 町テーブルには町テーブルと町コードのカラムがあります。 住所テーブルには地域コード、県コード、町コードと建物の名前のカラムがあります。 存在管理テーブルには、削除フラグというカラムがあります。 ここで削除フラグは、存在しない住所になると削除フラグに1を設定し、検索時には削除フラグに1が立っているものは検索できないようにするためのものです。普段は削除フラグは0になるように設定しています。 地域と県名と町名はプルダウンで選択できるようになっています。 【質問内容】 地域のプルダウンにある「関西」を選択すると選択された地域に該当する県名や町名、建物名が検索される。 また県名、町名についても同様に検索される。 地域、県名に「関西」「大阪」選択すると「関西」「大阪」に該当する町名、建物名が検索される。 さらに建物の名前の前方一致検索もできる。 ちなみにこれを1文で書きたいです。 以上のSQL文はどのようになるでしょうか。 mysqlのバージョンは4.0です。 どなたかお教えください。

    • ベストアンサー
    • MySQL
  • 異なるデータベース間のテーブル結合

    DB名:db1 TABLE名:得意先マスタ DB名:db2 TABLE名:ユーザマスタ 以上のように、異なるデータベースに存在する2つのテーブルをLEFT JOINさせたいです。 結合条件は ユーザマスタ.得意先コード = 得意先マスタ.得意先コード とします。 この場合の結合方法を教えてください。 以下のようなSQL文を書いても駄目でした。 SELECT * FROM db1.ADMINISTRATOR.得意先マスタ AS  得意先マスタ   LEFT OUTER JOIN db2.ADMINISTRATOR.ユーザマスタ AS ユーザマスタ ON ユーザマスタ.得意先コード = 得意先マスタ.得意先コード よろしくお願いいたします。

  • データベース検索で特定のレコードのみ除外するには

    お世話になります。 データベースのkeyカラムに1~9999999までの数字がいろいろ入っている場合に、検索条件として百の位が9のレコードを検索結果から除外してfetchAll()で取得、一覧表示するにはどうすればよいでしょうか? カラム名 not like '%[900-999]'; とか カラム名 not like '%[9][ ]'; 等やってみたのですがどうも意図したように動いてない感じです。

    • ベストアンサー
    • PHP
  • データベースのデータの持たせ方・取得方法について

    Mysqlを使ってwebアプリ開発を行っています。 ユーザ情報として趣味を最大5件(3件は必須)で入力できるようにしたいのですが、 その場合のデータの持たせ方を以下のように考えていますが問題ないでしょうか。 もっとよい方法などがあればご教示をお願いします。(下記は一部だけ抜粋したテーブル定義です) ■テーブルA(ユーザデータ) ・ユーザID ・ユーザ名 ・趣味ID1 ・趣味ID2 ・趣味ID3 ・趣味ID4 ・趣味ID5 ■テーブルB(趣味マスタ) ・趣味ID・・・テーブルAの趣味ID1~5と紐づく ・趣味名 ■補足事項 ・ユーザは5つの入力ボックスに自由に入力できる。 ・値が入力されて登録ボタンが押された際に、入力値でテーブルBを検索し検索がヒットすれば そのIDをテーブルAに登録。検索がヒットしなければテーブルBにその値を新規登録し、テーブルAにもそのIDを登録。 またこのようなデータ構造にした場合、 データ(ユーザ名、趣味1~5の趣味名)を一覧表示する場合どのようなSELECT文でデータを取得すればよいでしょうか?テーブルAとテーブルBをJOINで結合すればよいと思いますが、結合させたいカラムが複数ある場合にどのようなクエリにすればよいのかがいまいちわかりません。 よろしくお願いします。

    • ベストアンサー
    • MySQL