住所録データベースの設計について

このQ&Aのポイント
  • EXCELで住所録を作っていましたが、ACCESSに切り替えるためのデータベース設計について相談です。
  • 個人で複数の住所を持っている人や、結婚などにより2人が1つの住所に住んでいる場合を考慮して、「個人」と「住居」の2つのテーブルを作り、多対多の関係で結びたいと思っています。
  • また、e-mailや携帯電話、年賀状の履歴なども扱いたいため、それぞれにテーブルを用意する予定です。しかし、年賀状の送り先やメールアドレスの所有者は個人でも家族でもあります。この場合、個人と住居の両方にメールや履歴データを関連づける方法についても相談したいです。
回答を見る
  • ベストアンサー

住所録データベースの設計

EXCELで住所録を作ってましたが、ACCESSに切り替えよう と思っている者です。 今、住所録データベースの設計をしているのですが、 1) 個人で複数の住所を持っている人間が多い(実家・現住所など) 2) 結婚などにより、2人が1つの住所に住んでいる場合がある。 ので、「個人」テーブルと、「住居」テーブルを、2つ別々に作り、多対多で結ぼうと思ってます。 e-mail、携帯電話、年賀状履歴の情報も扱いたいと思ってます(それぞれにテーブルをおくつもりです)。 e-mailや履歴を、「個人」または「住居」どちらかに関連づけたいのですが、年賀状は個人に送る場合もあるし、家族に送る場合もあります。メールアドレスも、個人所有がほとんどですが、なかには家族所有なんかもあり。 個人と、住居の両方に、メールや履歴データを関連づける方法はないでしょうか? 例えば履歴テーブルに住居IDと個人IDの2つのフィールドをおいて、レコード毎に好きな方を入力しても設計として問題ないのでしょうか? よろしくお願いします。

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

  • ベストアンサー
noname#161966
noname#161966
回答No.1

個人(ID, name, bith..., 連絡先.ID) 住居(ID, addr, addr_number..., 連絡先.ID) 居住(個人.ID, 住居.ID) 連絡先(ID, mail, phone...) 履歴(連絡先.ID, date, type...) 正規化すると、こういう感じですか? 細かい属性をどうするかは自由にして欲しいのですが、こうしておくことの特徴は次のような感じになります。 ・個人は個人で管理できる。 ・住居は住居で管理できる。 ・連絡先は個人や住居とは独立したものとして設計し、個人や住居が連絡先を持つと考える。 ・個人と住居の多対多の関係は居住という関係テーブルを設定することで一対多に変換する。 質問にあるように個人と住居の両方にメールや履歴データを関連付けることは、この連絡先テーブルを介して出来ると思います。質問の中でおっしゃっている様に履歴テーブルに住居IDと個人IDの2つのフィールドをおいて、レコードごとに好きなほうを入力しても別に問題はないと思います。この辺の話は、どういう風にデータを利用することが多いのかによって設計はトレードオフになるのでは? こういう設計の話は勘違いして回答してしまうと的外れになってしまうので、参考にならなかったら気にしないでくださいね。

kana21
質問者

お礼

ありがとうございます。助かります。 なるほど、連絡先テーブル、という概念は思い浮かびませんでした。 個人や住居が複数のメールアドレスを持てるようにしたいので、 連絡先の考えも入れて、もう少し頭をひねってみます。 多対多で結べばいいのかな?うーん・・。少し考えれば出来そうな 気がしてきました。ありがとうございました。

その他の回答 (1)

回答No.2

回答ではないのですが。すみません。 私も同じようなものを作りたいと考えていたのですが、Access自体使ったことが無いので良く分かりません。参考になるような本やURLをご存知でしたら教えていただけませんでしょうか?

関連するQ&A

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

    現在PostgreSQL(ver 8.4)を使ってちょっとしたシステムの構築を計画していますが、データベースの設計に関して広くアドバイスを頂きたいです。 ユーザーの入力データをDBで効率よく管理したいと考えています。 例えば、次のようなテーブルを作るとします。 userテーブル id | name ---+------------- 1 | 山田太郎 2 | 高橋次郎 .. | ............. .. | ............. emailテーブル id | address ---+------------------------------ 1 | yamada@mail.com 2 | takahashi@mail.com .. | ................................. .. | ................................. この様な複数のテーブルにユーザーの入力を受け、1対1に対応するIDを振って名前やアドレスなどのデータをリアルタイムで挿入していく場合、どのようなテーブルを用意し、プログラムを組むのが適切なのでしょうか? 具体的には、PerlでCGIをつくり、ブラウザ上などからユーザーの入力したデータを取得してPostgreSQLに次々挿入していく形にしようとしています。 具体的なPerlのコードを書いていただけると助かるのですが、他の言語のコードでも一向に構いません。 今のところ、自分で考えたものとしては、 create table user( id serial, name text); create table email( id serial, address text); とテーブルを用意し、 Perlコードの概要は use DBI; # *実際にはユーザーの入力値から値を得る $input_user = 'name_hogehoge'; $input_email = 'address_hogehoge@mail.com'; # DBとの接続 $dbh = DBI->connect("dbi:Pg:dbname=hogehoge", ......); # プレースホルダの準備 $sth_user = $dbh->prepare("INSERT INTO user (name) VALUES(?)"); $sth_email = $dbh->prepare("INSERT INTO email (address) VALUES(?)"); # SQLの実行 $sth_user->execute("$input_user"); $sth_email->execute("$input_email"); # コミット $dbh->commit; といった感じで考えていました。しかしidの対応が確実に取れるかなど不安な点がありますので、アドバイスいただけたらと思います。 もちろんこの方法に固執する必要はなく、結果的に同じようなテーブルが得られれば問題ないです。 長々と失礼致しました。

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

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

    • ベストアンサー
    • MySQL
  • 1対多の場合のデータベース設計

    データベースの設計段階で、1対多となる場合、どういうデータベース設計をすれば良いのか分かりません。 具体的に例として挙げれば、ショッピングサイトがあるとします。 その中で、1つの商品があります。 1つの商品には1つの名前、1つの価格など、1対1のものがありますが、中には購入履歴など、1対1ではなく、1対多のものがあります。 この場合、その気になれば100でも1000でも増えていきます。こういった、項目の数が具体的に決まっていない場合、どういうデータベースの列を作成すれば良いのでしょうか? 多くても大丈夫なように、購入履歴1という列から購入履歴1000という列まで1000列用意するしかないのでしょうか?

  • データベースで変更の多いテーブルの設計

    データベースを設計しています。 あるテーブルに関して、項目(列)が50個くらいあるのですが、これらのうち20個くらいの列が頻繁に変更があり、データの履歴が必要になるため、テーブルを再設計しようと考えています。 現在は変更があるたびにテーブル全体を別テーブルにコピーして、寄せています。 このような場合、何かよい設計方法はあるでしょうか?

  • データベーステーブル設計

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

  • 映画のデータベースの設計について・・・

    データベースの設計について質問です。 現在、映画のデータベースのようなものを作成しようとしているのですが、そこで、出演者のデータをどのようにしようか悩んでおります。 タイトルごとにユニークなIDをふって、 出演者用のテーブルを作り、タイトルIDと出演者名を結びつけるという方法でいいのでしょうか? この場合・・・ ・タイトルのIDを覚えておく ・出演者用のテーブルに移動し、IDと出演者名を入力する という作業が、出演者の人数分必要になりかなり大変そうなのですが、このような作業を簡略化する方法はあるのでしょうか? わかりにくい文章でもうしわけありません。 どうかよろしくお願いします。

  • レリーショナルな設計

    [家族IDテーブル] (家族ID, 家族名) kaz001, 佐々木家 kaz002, 黒川家 kaz003, 岡本家 [個人IDテーブル] (個人ID, 個人名) koj001, kaz001, 拓也 koj002, kaz001, 啓太 koj003, kaz002, 直樹 [アクセスログ] (個人単位でアクセス数を引いたり家族単位で引いたりもする) 日付け、アクセス回数、家族、個人 ?それとも 日付け、アクセス回数、個人 リレーショナルテーブルについて勉強しています。 [家族IDテーブル]と[個人IDテーブル]が有り、[アクセスログ]というテーブルを作る場合に、そのフィールドは  日付け、アクセス回数、個人 よりも  日付け、アクセス回数、家族、個人 の方が(家族単位で引く場合)高速に結果を得られると思います。 しかし、個人が分かれば家族も分かるので、前者でも使えはしますが、遅いと思うのです。 リレーショナルテーブルは、リレーショナルでないものと比べて品質が高いものだと思いますが、後者のようにしてリレーショナルでないものにして高速化するのはよい方法ですか?

  • データベース設計の図が判りづらい

    データベース設計でよく使われるER図が理解しづらいです。 例えば、wikipediaに載っているこの図 http://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E8%A8%AD%E8%A8%88 userテーブルのuser_idと、revisionテーブルのrev_userが関連している、 というのは、フィールドの名前を丁寧に読めば判りますが・・・ 似たような名前のフィールドが複数ある場合など、 どうやって判断するのでしょうか。。? もっとリレーションシップ等の構造がパッ見てと判るような 標準的な図の書き方(●●図と言えば誰でも判るような)って無いでしょうか。。?

  • テーブル設計について

    会員制の小さなサイトを運営しています。 会員は会員IDで管理しているのですが、テーブル設計が適切であるか判断できず、助言を頂きたく書き込みさせて頂きました。 現在、会員情報テーブル(info)というテーブルが全ての基本となっています。 このテーブルには、会員IDの他、名前や性別、住所、自己紹介文などほとんど全ての会員情報が含まれています。 このほかに会員同士の交流用のテーブル(koryu)がいくつかあり、 そこには、会員IDとその会員が行った内容が記録されています。 で、現状、交流用テーブルを使用する場合、常に会員の名前を会員情報テーブルから引っ張ってきており、これが、処理的に重いのでは無いか、と思っています。 以下はたとえばの例ですが、  select koryu.id, info.name, koryu.contents from info,koryu where koryu.id=info.id のように、毎回、(ほぼ)名前だけを引っ張ってきています。 引っかかっているのは、この「名前だけ」というところで、例えば、会員IDと名前しかないテーブルを作成すれば、もしかしたら、処理が軽くなるのでは・・と思っているのです。 20カラムあるテーブルと関連付けを行う場合と、2カラムのテーブルと関連付けを行う場合、 2カラムのテーブルのほうが、処理は軽くなるのでしょうか?また、軽くなる場合、そうしたほうが良いのでしょうか? (現在、1000名くらいしか会員がいないため、処理が重いということは無いのですが、 安いサーバを使用しているため、処理はなるべく軽くしておきたいと思っています。) よろしくお願いします。

    • ベストアンサー
    • MySQL
  • データベースの設計をしています。

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

    • ベストアンサー
    • MySQL