dポイントプレゼントキャンペーン実施中!

顧客管理データベースシステムを作成しようとしているのですが、
データベースの要素に複数データが入る場合の管理方法が
分からず困っています。

一例を挙げると、複数の電話番号を持つ人にも対応するように
データベース設計をしようとした場合、どのようにするのが
ベストなのかが分かりません。

電話番号1,電話番号2といったような要素を用意して、
データベースを検索するときには両方を参照する以外に
手は無いのでしょうか?

それとも顧客番号と複数電話番号検索用IDのようなものを対応させ、
電話番号データベース(電話番号ID、電話番号1、電話番号2、電話番号3)
のようなものを用意することで調べるのでしょうか?

正直、どちらもデータベース要素が3つ以上の場合に融通が利かなかったり
まだるっこしい感じがしたりするのですが、代替手段を良く知りません。
何か良い方法ございましたら、ご教示願えませんでしょうか?

A 回答 (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]=[検索番号]
    • good
    • 3
この回答へのお礼

表示順と種別を設定するのは、柔軟性の意味で非常に良いですね。
柔軟性を高めるという意味では、システムの複雑化は避けえない
問題みたいですね。

SQL文で書くと、
select 顧客番号,etc… from 顧客データベース
full join 電話データベース on
顧客データベース.顧客番号 = 電話データベース.顧客番号
WHERE 電話1=検索番号 OR 電話番号2 = 検索番号…
といった感じでしょうか。

いずれにせよ、電話番号の数は予め設定することは不可欠みたいですね。
電話であればまだ決め打ちで数を決めても良いですが、
好きな映画など項目数が分からない場合の検索はどうなるんでしょう?

なんとなく答えは単純なような気配がものすごくしますが、
混同してしまっているので教えていただけると助かります。

お礼日時:2010/12/21 21:05

> 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 = [検索番号]

ということです。
    • good
    • 0

>1フィールドが可変個の電話番号を持つような


>イメージで管理・・・というのが理想

決め打ちでフィールドを用意しても、1電話番号を1レコードとしてテーブルでも
どちらでも管理できそうな話ですが、
何がいいかというのは、
検索で見つかった電話情報をどう使うかにもよります。
検索で見つけやすくなった、のその先の話です。

一般的に見ても1管理単位=10個の電話番号も行かないのでは?。
何個発生するかわからないほどのデータ管理にならないのでは?。

仮に、
1フィールド200バイトに連結文字として確保して
必要に応じて10バイト区切りにすると可変管理になります。
格納バイト長/10=何個格納しているか、です。
そこに50バイトあれば5つ分、70バイトあれば7つ分が
入力されていることになります。
1フィールドなら当然検索も楽です。
もう1つ「何個あります」のフィールドを用意してもいいでしょう。
    • good
    • 2

検索で困っている、ということでしたら


テーブルを増やすのでなくて、項目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したりさせなくてもいいと思います。
    • good
    • 0
この回答へのお礼

検索番号の発想はありませんでした。
検索しやすくなりそうですね。

唯一の難点は電話番号の数を決め打ちで
フィールドを作成する所でしょうか?

顧客の所持する電話番号の数に応じて
1フィールドが可変個の電話番号を持つ
ようなイメージで管理・・・というのが
理想なのですが、私自身そんな管理方法を
聞いたことがありませんし、
やっぱり存在しないのでしょうか?

お礼日時:2010/12/21 20:45

ま、電話番号の2つや3つくらいなら、顧客マスタの中に


顧客ID、顧客名称、....,電話番号1、電話番号2、電話番号3とかすればいいのです。
くだらんことで妙なJOINとかしてややこしいことになるより簡単です。
電話番号を外だしにするなら、顧客ID、補助電話番号、優先番号とかするしかないですけど。
そんなことするより顧客を複数登録する方が簡単です。
お客様1代表
お客様1直通
とか

この回答への補足

システム設計上ではおっしゃる通りにするのが
恐らく楽そうですが、顧客を複数登録した場合
片方の顧客だけ情報を更新してしまうなど、
更新異常が起こることが懸念されるので
抵抗があります。

補足日時:2010/12/21 20:37
    • good
    • 1

データベース テーブルの正規化ですね。



電話番号のみの登録テーブルを作ります。
 [オートナンバー] [顧客ID][電話番号][主に使用フラグ]

といったレコード設計でどうでしょうか?

顧客のテーブルの[顧客ID]などで、顧客と電話番号のグループの関連づけをします。

※ [オートナンバー] は、重複レコードを防ぐ識別番号なので、
電話番号自体がユニークになるのであれば、必要ないかもしれません。
(ただ、登録順序を明確にすることができます。)

※ また、[主に使用フラグ]は、[優先順序]のフィールドに変えて通常使用する
電話番号を管理しても良いかもしれません。

※ その他として、電話/携帯電話/FAXなどを区別するフィールドがあると便利です。

参考になりましたでしょうか?
    • good
    • 0
この回答へのお礼

確かに、携帯のアドレス登録みたいに
通常利用する電話番号フラグはあっても良いかもしれませんね。
状況に合わせたフィールドも参考になります。

お礼日時:2010/12/21 20:33

そもそも複数の電話番号を登録しないと行けない状態が判りませんが・・・


代表回線登録しとくだけじゃ駄目なんでしょうかね?
通常、固定電話と携帯電話の2つあれば十分な気がしますが。

複数の電話番号を管理したいのなら、顧客IDと電話番号を1:nで紐づければ良い訳ですから、顧客IDと電話番号をキーにしたテーブル作って、顧客情報テーブルとjoinして引っ張ってくれば良いのでは?

この回答への補足

顧客テーブルとjoinするやり方は
データベース更新等が煩雑になりそうなので、
ちょっと倦厭しておりました。

同じ部署の場合、違う顧客が同じ電話番号となるケースもあるので、
必ずしも電話番号と顧客がn:1の関係にならないのも悩み所です。

補足日時:2010/12/21 20:30
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す