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