顧客管理データベースシステムを作成しようとしているのですが、
データベースの要素に複数データが入る場合の管理方法が
分からず困っています。
一例を挙げると、複数の電話番号を持つ人にも対応するように
データベース設計をしようとした場合、どのようにするのが
ベストなのかが分かりません。
電話番号1,電話番号2といったような要素を用意して、
データベースを検索するときには両方を参照する以外に
手は無いのでしょうか?
それとも顧客番号と複数電話番号検索用IDのようなものを対応させ、
電話番号データベース(電話番号ID、電話番号1、電話番号2、電話番号3)
のようなものを用意することで調べるのでしょうか?
正直、どちらもデータベース要素が3つ以上の場合に融通が利かなかったり
まだるっこしい感じがしたりするのですが、代替手段を良く知りません。
何か良い方法ございましたら、ご教示願えませんでしょうか?
No.5ベストアンサー
- 回答日時:
正規化して、電話番号を別テーブルに持つか、
顧客マスターに、電話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]=[検索番号]
表示順と種別を設定するのは、柔軟性の意味で非常に良いですね。
柔軟性を高めるという意味では、システムの複雑化は避けえない
問題みたいですね。
SQL文で書くと、
select 顧客番号,etc… from 顧客データベース
full join 電話データベース on
顧客データベース.顧客番号 = 電話データベース.顧客番号
WHERE 電話1=検索番号 OR 電話番号2 = 検索番号…
といった感じでしょうか。
いずれにせよ、電話番号の数は予め設定することは不可欠みたいですね。
電話であればまだ決め打ちで数を決めても良いですが、
好きな映画など項目数が分からない場合の検索はどうなるんでしょう?
なんとなく答えは単純なような気配がものすごくしますが、
混同してしまっているので教えていただけると助かります。
No.7
- 回答日時:
> 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 = [検索番号]
ということです。
No.6
- 回答日時:
>1フィールドが可変個の電話番号を持つような
>イメージで管理・・・というのが理想
決め打ちでフィールドを用意しても、1電話番号を1レコードとしてテーブルでも
どちらでも管理できそうな話ですが、
何がいいかというのは、
検索で見つかった電話情報をどう使うかにもよります。
検索で見つけやすくなった、のその先の話です。
一般的に見ても1管理単位=10個の電話番号も行かないのでは?。
何個発生するかわからないほどのデータ管理にならないのでは?。
仮に、
1フィールド200バイトに連結文字として確保して
必要に応じて10バイト区切りにすると可変管理になります。
格納バイト長/10=何個格納しているか、です。
そこに50バイトあれば5つ分、70バイトあれば7つ分が
入力されていることになります。
1フィールドなら当然検索も楽です。
もう1つ「何個あります」のフィールドを用意してもいいでしょう。
No.4
- 回答日時:
検索で困っている、ということでしたら
テーブルを増やすのでなくて、項目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フィールドが可変個の電話番号を持つ
ようなイメージで管理・・・というのが
理想なのですが、私自身そんな管理方法を
聞いたことがありませんし、
やっぱり存在しないのでしょうか?
No.3
- 回答日時:
ま、電話番号の2つや3つくらいなら、顧客マスタの中に
顧客ID、顧客名称、....,電話番号1、電話番号2、電話番号3とかすればいいのです。
くだらんことで妙なJOINとかしてややこしいことになるより簡単です。
電話番号を外だしにするなら、顧客ID、補助電話番号、優先番号とかするしかないですけど。
そんなことするより顧客を複数登録する方が簡単です。
お客様1代表
お客様1直通
とか
この回答への補足
システム設計上ではおっしゃる通りにするのが
恐らく楽そうですが、顧客を複数登録した場合
片方の顧客だけ情報を更新してしまうなど、
更新異常が起こることが懸念されるので
抵抗があります。
No.2
- 回答日時:
データベース テーブルの正規化ですね。
電話番号のみの登録テーブルを作ります。
[オートナンバー] [顧客ID][電話番号][主に使用フラグ]
といったレコード設計でどうでしょうか?
顧客のテーブルの[顧客ID]などで、顧客と電話番号のグループの関連づけをします。
※ [オートナンバー] は、重複レコードを防ぐ識別番号なので、
電話番号自体がユニークになるのであれば、必要ないかもしれません。
(ただ、登録順序を明確にすることができます。)
※ また、[主に使用フラグ]は、[優先順序]のフィールドに変えて通常使用する
電話番号を管理しても良いかもしれません。
※ その他として、電話/携帯電話/FAXなどを区別するフィールドがあると便利です。
参考になりましたでしょうか?
確かに、携帯のアドレス登録みたいに
通常利用する電話番号フラグはあっても良いかもしれませんね。
状況に合わせたフィールドも参考になります。
No.1
- 回答日時:
そもそも複数の電話番号を登録しないと行けない状態が判りませんが・・・
代表回線登録しとくだけじゃ駄目なんでしょうかね?
通常、固定電話と携帯電話の2つあれば十分な気がしますが。
複数の電話番号を管理したいのなら、顧客IDと電話番号を1:nで紐づければ良い訳ですから、顧客IDと電話番号をキーにしたテーブル作って、顧客情報テーブルとjoinして引っ張ってくれば良いのでは?
この回答への補足
顧客テーブルとjoinするやり方は
データベース更新等が煩雑になりそうなので、
ちょっと倦厭しておりました。
同じ部署の場合、違う顧客が同じ電話番号となるケースもあるので、
必ずしも電話番号と顧客がn:1の関係にならないのも悩み所です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 会社・職場 今月から不動産賃貸の営業職に就いた者ですが、職場で以下のようなことがありました。 女性社員から→(帰 3 2022/08/15 10:59
- その他(スマートフォン・携帯電話・VR) LINEに使用している電話番号を解約した場合、 引き継ぎ等をしないでそのアカウントを使い続けることは 5 2023/03/15 23:00
- Android(アンドロイド) Googleからのメールに対してどう操作するのか? 1 2023/01/08 19:34
- 格安スマホ・SIMフリースマホ SMS認証用の電話番号が欲しい 6 2022/06/12 18:21
- X(旧Twitter) Twitterの電話番号の登録に関する質問です。 2 2023/04/01 08:40
- 格安スマホ・SIMフリースマホ 以前楽天で、今マイネオに変えました。行き先マップで検索して、電話番号表示してる所を押すと電話を掛けて 4 2022/09/20 10:40
- LINE 電話番号をへんこうしたいのですが、、 2 2022/12/14 15:46
- LINE 携帯電話番号を変更したいのですが... 1 2022/12/14 00:50
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- その他(メールソフト・メールサービス) スマホに届いた【重要なお知らせ】のメールの発信元について 1 2022/04/04 19:36
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
DB設計について
MySQL
-
一つのフィールドに複数の情報を持たせたいです。
MySQL
-
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
-
4
カンマ区切りで格納するカラムって設計上ありでしょうか?
その他(データベース)
-
5
テーブルに主キーを作らないデメリットは?
その他(Microsoft Office)
-
6
1つのカラムに複数レコードの値を・・・
Oracle
-
7
外部参照してるキーを主キーにすることは可能?
その他(データベース)
-
8
【ACCESS】リレーションを組んでいるフィールドがNullの場合
その他(プログラミング・Web制作)
-
9
テーブルタグの中にdivを含めてはダメ?
HTML・CSS
-
10
MySQLでデータベースにデータinsert時のエラー。
Java
-
11
入力値と外部キーをINSERTするには
MySQL
-
12
sqlに記述できない文字
PostgreSQL
-
13
クラス間でのデータ参照
Java
-
14
住所のDBテーブル、マスターの構成について
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ワードでの単純作業の効率化に...
-
文字化け、記号の含まれるフィ...
-
データベースの1要素に複数デー...
-
Access VBAでクエリーのレコー...
-
Access フォームのデータがテー...
-
ワードで保存するファイル名の...
-
Access 既に開いているフォー...
-
access、パラメータの順番を並...
-
ACCESSで重複したデータがある...
-
Access レコードロックについて...
-
テーブル1 2 3 の結合
-
シングルクォーテーションとダ...
-
Excel 2019 のピボットテーブル...
-
Oracle 2つのDate型の値の差を...
-
エクセルVBAで5行目からオート...
-
Accessのフィールド数が255しか...
-
ACCESSに同時アクセス(編集)を...
-
「直需」の意味を教えてください
-
Accessでテーブル名やクエリ名...
-
ORACLEでLONG項目からCHAR項目...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
データベースの1要素に複数デー...
-
Access VBAでクエリーのレコー...
-
Access IF文でテーブルに存在し...
-
Access フォームのデータがテー...
-
顧客IDを入力すると顧客名や住...
-
ACCESS で マクロの中でフィ...
-
ワードでの単純作業の効率化に...
-
ワードで保存するファイル名の...
-
シングルクォーテーションとダ...
-
Access 縦(行)のデータを横(列)...
-
別のDBからテーブルをコピーす...
-
Access 既に開いているフォー...
-
Access2000 単票フォーム上の...
-
Accessデータベースで行と列を...
-
文字化け、記号の含まれるフィ...
-
Accessで名寄せグループの関係...
-
Access レコードロックについて...
-
ACCESSで重複したデータがある...
-
【続続】Access2002で連番のつ...
-
Access クエリ このレコードセ...
おすすめ情報