- ベストアンサー
データベース要素に複数データを格納する方法
- 顧客管理データベースシステムを作成しようとしている際に、データベース要素に複数のデータが格納される場合の管理方法について困っています。
- 例えば、複数の電話番号を持つ人に対応するためには、どのようなデータベース設計が最適なのかわかりません。
- 既存のデータベース要素を参照する方法以外に、顧客番号と電話番号検索用IDを関連付けることで対応する方法も考えられますが、他に良い方法があるのか教えてください。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
正規化して、電話番号を別テーブルに持つか、 顧客マスターに、電話1、電話2、電話3・・・と複数フィールドを持たせるか、 それぞれメリットとデメリットがあるので、 使い方次第でどちらでもいいかと思います。 固定、FAX、携帯、だけでなく、部署別とかで、多数ある可能性があるのなら、 別テーブルにした方がいいでしょう。 設計例 [顧客ID][表示順][電話番号][種別] 1111__1___012-111-1111 固定 1111__2___012-111-2222 FAX 1111__3___012-111-3333 携帯 顧客ID と 表示順 で複数フィールド主キーに設定 柔軟性が高いです。電話番号がどれだけ増えても対応できます。 joinしたものを対象に検索すれば、インデックスを使って高速に処理できます。 最大3つとか5つまでとか限定できるなら顧客マスターに全部入れてもいいでしょう。 ANo.4 で提案されている検索用のフィールドを作成するのもなかなかいいアイデアですが、デー多数が多いとインデックスが利用できないので重くなる可能性があります。 その場合は、面倒ですが、Orで連結した条件式を用意すればいいでしょう。 [電話1]=[検索番号] Or [電話2]=[検索番号] Or [電話3]=[検索番号]
その他の回答 (6)
- hatena1989
- ベストアンサー率87% (378/433)
> SQL文で書くと、 > select 顧客番号,etc… from 顧客データベース > full join 電話データベース on > 顧客データベース.顧客番号 = 電話データベース.顧客番号 > WHERE 電話1=検索番号 OR 電話番号2 = 検索番号… > といった感じでしょうか。 顧客マスタと電話番号テーブルと分割した場合(正規化)と、顧客マスターに電話番号を入れた場合と、ゴッチャにしてますね。 正規化した場合は、 電話番号テーブルは、1レコード1電話番号になりますので、 SELECT 顧客マスタ.* FROM 顧客マスタ LEFT JOIN 電話番号テーブル ON 顧客マスタ.顧客番号 = 電話番号テーブル.顧客番号 WHERE 電話番号 = [検索番号] です。 顧客マスターに電話番号を入れた場合は、 SELECT 顧客マスタ.* FROM 顧客マスタ WHERE 電話1 = [検索番号] OR 電話2 = [検索番号] OR 電話3 = [検索番号] ということです。
- layy
- ベストアンサー率23% (292/1222)
>1フィールドが可変個の電話番号を持つような >イメージで管理・・・というのが理想 決め打ちでフィールドを用意しても、1電話番号を1レコードとしてテーブルでも どちらでも管理できそうな話ですが、 何がいいかというのは、 検索で見つかった電話情報をどう使うかにもよります。 検索で見つけやすくなった、のその先の話です。 一般的に見ても1管理単位=10個の電話番号も行かないのでは?。 何個発生するかわからないほどのデータ管理にならないのでは?。 仮に、 1フィールド200バイトに連結文字として確保して 必要に応じて10バイト区切りにすると可変管理になります。 格納バイト長/10=何個格納しているか、です。 そこに50バイトあれば5つ分、70バイトあれば7つ分が 入力されていることになります。 1フィールドなら当然検索も楽です。 もう1つ「何個あります」のフィールドを用意してもいいでしょう。
- layy
- ベストアンサー率23% (292/1222)
検索で困っている、ということでしたら テーブルを増やすのでなくて、項目1つ「検索電話」準備するのみ。 電話1、電話2、電話3・・・・・ を 電話1、電話2、電話3・・・・・、検索電話 電話xは5つくらいあれば十分では?。 「検索電話」には、 「電話1」「電話2」「電話3」・・の連結文字列、 電話1=1111111111 電話2=2222222222 電話3=3333333333 なら 検索電話=#1111111111#2222222222#3333333333#xxxxxxxxxx#xxxxxxxxxx#・・・ 検索電話の1項目だけで検索できますし顧客を特定できます。 電話1が変わっても検索電話の値更新は楽ですし、 市外局番だけでも検索はできます。 電話無、電話1しかない、電話5つある、でも対応です。 「#」は使われない文字を使う。仮の区切り文字。 とある1顧客で管理したい電話、またその検索の仕方、 とある1電話で管理したい顧客、またその検索の仕方、 1:1なのか1:nなのかn:nなのか、 こういうこと考えていけば、構造が見えてくるのではないでしょうか。 テーブルA 顧客あ、電話1=1111111111、電話2=2222222222、・・・・ を テーブルB 顧客あ、電話1=1111111111 顧客あ、電話2=2222222222 顧客あ、・・・・ とするのも面倒です。 例えば、同じ系列の顧客で電話番号が同じで良い、となった場合、 顧客あ、電話1=1111111111 顧客あ、電話2=2222222222 顧客あ、・・・・ 顧客い、電話1=1111111111 電話を検索して複数顧客が結果に出るようだと単票フォームでは表示面倒です。 単なる情報として持っていたいだけなら電話番号テーブルを作るほどではないのでは?。 管理が面倒になるだけなので、 別テーブルでJOINしたりさせなくてもいいと思います。
お礼
検索番号の発想はありませんでした。 検索しやすくなりそうですね。 唯一の難点は電話番号の数を決め打ちで フィールドを作成する所でしょうか? 顧客の所持する電話番号の数に応じて 1フィールドが可変個の電話番号を持つ ようなイメージで管理・・・というのが 理想なのですが、私自身そんな管理方法を 聞いたことがありませんし、 やっぱり存在しないのでしょうか?
- SaKaKashi
- ベストアンサー率24% (755/3136)
ま、電話番号の2つや3つくらいなら、顧客マスタの中に 顧客ID、顧客名称、....,電話番号1、電話番号2、電話番号3とかすればいいのです。 くだらんことで妙なJOINとかしてややこしいことになるより簡単です。 電話番号を外だしにするなら、顧客ID、補助電話番号、優先番号とかするしかないですけど。 そんなことするより顧客を複数登録する方が簡単です。 お客様1代表 お客様1直通 とか
補足
システム設計上ではおっしゃる通りにするのが 恐らく楽そうですが、顧客を複数登録した場合 片方の顧客だけ情報を更新してしまうなど、 更新異常が起こることが懸念されるので 抵抗があります。
- noyuo
- ベストアンサー率39% (33/84)
データベース テーブルの正規化ですね。 電話番号のみの登録テーブルを作ります。 [オートナンバー] [顧客ID][電話番号][主に使用フラグ] といったレコード設計でどうでしょうか? 顧客のテーブルの[顧客ID]などで、顧客と電話番号のグループの関連づけをします。 ※ [オートナンバー] は、重複レコードを防ぐ識別番号なので、 電話番号自体がユニークになるのであれば、必要ないかもしれません。 (ただ、登録順序を明確にすることができます。) ※ また、[主に使用フラグ]は、[優先順序]のフィールドに変えて通常使用する 電話番号を管理しても良いかもしれません。 ※ その他として、電話/携帯電話/FAXなどを区別するフィールドがあると便利です。 参考になりましたでしょうか?
お礼
確かに、携帯のアドレス登録みたいに 通常利用する電話番号フラグはあっても良いかもしれませんね。 状況に合わせたフィールドも参考になります。
そもそも複数の電話番号を登録しないと行けない状態が判りませんが・・・ 代表回線登録しとくだけじゃ駄目なんでしょうかね? 通常、固定電話と携帯電話の2つあれば十分な気がしますが。 複数の電話番号を管理したいのなら、顧客IDと電話番号を1:nで紐づければ良い訳ですから、顧客IDと電話番号をキーにしたテーブル作って、顧客情報テーブルとjoinして引っ張ってくれば良いのでは?
補足
顧客テーブルとjoinするやり方は データベース更新等が煩雑になりそうなので、 ちょっと倦厭しておりました。 同じ部署の場合、違う顧客が同じ電話番号となるケースもあるので、 必ずしも電話番号と顧客がn:1の関係にならないのも悩み所です。
お礼
表示順と種別を設定するのは、柔軟性の意味で非常に良いですね。 柔軟性を高めるという意味では、システムの複雑化は避けえない 問題みたいですね。 SQL文で書くと、 select 顧客番号,etc… from 顧客データベース full join 電話データベース on 顧客データベース.顧客番号 = 電話データベース.顧客番号 WHERE 電話1=検索番号 OR 電話番号2 = 検索番号… といった感じでしょうか。 いずれにせよ、電話番号の数は予め設定することは不可欠みたいですね。 電話であればまだ決め打ちで数を決めても良いですが、 好きな映画など項目数が分からない場合の検索はどうなるんでしょう? なんとなく答えは単純なような気配がものすごくしますが、 混同してしまっているので教えていただけると助かります。