• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:住所のDBテーブル、マスターの構成について)

住所のDBテーブル、マスターの構成について

yambejpの回答

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.5

>この場合、一つのテーブルに同じ都道府県や市区町村が重複して入るのを良しとす >るお考えでよろしいでしょうか? >この場合、運用上のやりやすさを考えたご提案かと思いましたが、その場合、デー >タ量が多少大きくなるのはOKとされますか? ENUMやSETで処理する限り、内部的には数値で管理されるため理論的に容量はさほど 大きくはなりません。したがって都道府県などリストの内容がほぼ普遍的なものに ついては容量を理由に正規化する必要はありません。 (とはいえ10年単位で考えると都道府県合併も可能性はありますが・・・) http://ja.wikipedia.org/wiki/%E5%88%97%E6%8C%99%E5%9E%8B#MySQL また市区町村は結構変更があるのと都道府県の下につく二次データであることから ENUMやSETに向きません。 正規化してもいいし、そのまま文字データで持ってもいいと思います。 >「SQLにおける効率的なデータは必ずしも容量を少なくするものではありません。」 正規化というのは多数の重複がある前提の技術です。 重複数があまりない場合は理論的には効率化されていますが実際には無駄な処理に なります。 また該当するカラムを集計のキーに使わない場合は無駄にインデックスを消費するため データは大きくなる半面全体的なスピードは低下する傾向にあります。 たとえば仮に「東京都」でデータを抽出するとき、ダイレクトに書いてある場合は 直にインデックスが効きますが、正規化してあると都道府県テーブルから 「東京都」を探し、都道府県IDを抽出したうえで都道府県IDに紐づいたレコードを 探すことになるので、処理的にはむしろ効率的ではありません。 実際には都道府県IDを最初から抽出した状態から検索するインタフェースなので 逆に正規化しておかないと、都道府県リストを都度つくる無駄がでますので 善し悪しでしょう。 >「都道府県名を入力欄にいれると不正にデータを抜かれやすくなると言われていた >時期もありますが、 >セキュアな技術を使えばそれは避けられるでしょう」 端的にいえばSSLで解決します。 もちろん都道府県IDに紐づけばトラフィックも減らせるので悪いわけではありません。 またインターネットのトラフィックが爆発的に増えている現在 よほど重要な個人情報でないかぎり住所からデータを不正に抜くことが 現実的ではなくなっているきらいもあります。 >都道府県名に対して、外部制約キーをつかったり、データ型をsetにしたりする >ことでデータを効率化することも可能です。 一部訂正します。 住所は都道府県が2つ以上存在しないためSET型よりENUM型がよいでしょう。 http://dev.mysql.com/doc/refman/5.1-olh/ja/enum.html >市町村名まで正規化するのが実用的かどうか 経験則でいえば、正規化する意義はあまり感じません。 例えば何万、何十万というデータ郡から市町村単位で広範なデータを集計する ようなケースを想定しているのであれば話は別ですが、単なる住所録としては メンテナンス性がおちるため市区町村名での正規化はお勧めしません。

superwonderful
質問者

お礼

丁寧にご回答ありがとうございました。 ご説明の通り、都道府県はEnum型でデータをセットするか、または、ドロップボックスなどでリストに値を設定していれば、その値を住所録テーブルに数値として保存するやり方にしようかと考えました。 そうすれば、画面表示も自動で数値によりリストの項目(都道府県名)が表示されるのでよろしいかと思います。 いろいろ参考になる情報をありがとうございます。

superwonderful
質問者

補足

詳しいご説明をして頂き、ありがとうございます。 いくつかのご回答を比較・検討し、yambeさんのアドバイスを参考に以下のようにする方法を検討してしいます。 ・顧客ID ・顧客名 ・郵便番号 ・都道府県 → Enum型の数値を設定する。 ・市区町村(住所1) ・住所2 そして、画面での処理は、 ・Enum型により、テーブルの都道府県に数値を保存 ・画面での入力は、ドロップボックスからの選択により、値は、Enum型と合わせる とすれば、スッキリしするような気がします。 しかし、それを自分で実際にAccessでテーブルと帳票型のフォームを作って試したのですが、どうもうまく行きません。 テーブルの都道府県に同期したテキストボックスは表示できますが、それでは数値なので、都道府県名がわかりませんし、都道府県名のドロップボックスを作っても、そこで、数値から名前に変更するやり方がわかりません。 ここに関して、申し訳ありませんが、具体的なやり方を説明していただけると助かります。 よろしくお願いいたします。

関連するQ&A

  • テーブル設計につきまして(正規化)

    顧客情報管理サイトを作ろうと思っています。 ・非正規化  {顧客コード , 氏名 , かな名 , 性別 , 郵便番号 , 都道府県 , 市区町村 , 建物名 , 電話番号 ,  FAX番号 , 携帯番号1, 携帯メール1 , 携帯番号2 , 携帯メール2 , 顧客ランク,備考}  の列を考えております。 ・正規化テーブル  1.顧客情報テーブル   {顧客コード , 氏名 , かな名 , 性別 ,郵便番号(外部キー) , 建物名 , 電話番号 ,   FAX番号 , 携帯番号1, 携帯メール1 , 携帯番号2 , 携帯メール2 , 顧客ランク,備考}  2.郵便情報   {郵便番号(主キー) , 都道府県 , 市区町村 これ以上、正規化できないと思っているのですが、顧客情報テーブルをもっと効率よく テーブルを設計し、正規化できるものでしょうか? よろしくお願いします。

  • テーブルの分散について

    お世話になります。 個人情報を格納しているユーザーテーブルがあります。 項目は以下の通りです。 ------------------------------ 1.連番 2.ユーザーID 3.名前カナ(姓) 4.名前カナ(名) 5.名前(姓) 6.名前(名) 7.性別 8.生年月日 9.年齢 10.電話番号 11.携帯番号 12.メールアドレス 13.パスワード 14.職業 15.郵便番号 16.国 17.住所(都道府県) 18.住所(市区町村) 19.住所(町域(番地)) 20.住所(建物名) 21.備考1 22.備考2 23.備考3 24.備考4 25.備考5 ------------------------------ 上記のように個人情報を1つのテーブルにまとめてセキュリティ上、問題はありませんでしょうか。 もし上記のテーブルを分散するとしたらどのように管理するようにしたらいいのでしょうか。 くだらない質問で大変申し訳ありませんがご教授いただけたら幸いです。 何卒、アドバイスの方を宜しくお願いします。

  • 住所の分割方法

    顧客データで、住所フィールドが1,2,3とあり、本来であれば、 1・・・都道府県 2・・・市区町村から番地 3・・・マンション、アパート名 としなければいけないのですが、郵便番号辞典から入力したため、住所2のフィールドに1と2がくっついて入力されています。 これを都道府県で切って、都道府県名を住所1のフィールドに、市区町村から番地までを住所2のフィールドに分割したいのですが、関数もしくはマクロがあれば教えてください。 住所1には、「東京都」などの「都」に相当する都道府県名まで入れたいのですが。 (データが5000件くらいあります)

  • 郵便番号と住所について。

    Access2000で住所録をつくっています。 郵便番号を入力して変換すると住所になる、というIMEの機能はわかったのですが、郵便番号と住所を別の欄につくったので、郵便番号を入力したら自動で住所欄に住所が入るようにしようと思い、郵政省のところから住所録(全国版)を持ってきました。 これを「住所録」というテーブルにしました。 フィールドとしては ・郵便番号 ・都道府県 ・市町村 ・町名 の4つです。 これを使い自動で入力を行うような状態にしたいのです。 郵便番号を入れると自動で入力されるようにする、というのはなんとかできそうなのですが、逆のパターンの場合にどうしたらいいか考えています。 (例えば同じ町名でも番地によって郵便番号が違うのはどうしたらいいか・・・など。) また、「北海道」と都道府県に入力したら市町村のところには北海道の市町村しか出ないようにするにはどうしたらよいでしょうか?(町名もおなじく。) やはり都道府県別にテーブルを作ったりする必要が出てきますか? よろしくお願いします。

  • Access、同じテーブルの2つの項目対他のテーブルで1つの項目のリレーションは可能?

    Accessで販売管理をしています。 以下のテーブルを作成し(*は主キーです)、 [売上T]  [商品M]  [顧客M]  [受注T] *売上NO  *商品ID  *顧客ID1  *受注NO 商品ID   商品名    *顧客ID2  商品ID 日付    顧客ID1     顧客名    受注日 金額    顧客ID2            受注金額        受注先1        受注先2 参照整合性にチェックを入れリレーションでつないでいます。 リレーションシップは下記のとおりです。 [売上T]商品ID―[商品M]商品ID―[受注T]商品ID [商品M]顧客ID1及び2―[顧客M]顧客ID1及び2―[商品M]受注先1及び2 ここで顧客と受注先が重複することもあるので、顧客Mから顧客ID及び受注先IDの2つのテーブルにリレーションシップを設定しているのですが、 クエリで  [受注T]受注NO及び受注金額、[顧客M]顧客名で抽出したところ、 5000件以上[受注T]にデータがあるはずのものが、1200件ほどしか抽出できませんでした。 ちなみに[顧客M]と[受注用顧客M]というまったく別のテーブルを作成し、 [商品M]受注先1及び2―[受注用顧客M]顧客ID1及び2 とリレーションを作成し、クエリで抽出するとうまくいきました。 しかしこの方法だと、[顧客M]と[受注用顧客M]という2つのテーブルを管理しなければならなくなるので面倒です。 そこで質問です。 同じテーブルの2つの項目対他のテーブルの1つの項目とでは、うまくリレーションが設定できないのでしょうか。 もし出来ない場合、[顧客M]と[受注用顧客M]の2つのテーブルを管理しなければならない訳ですが、 なんとか簡単に管理できる方法(ひとつのテーブルを変更すると簡単にもうひとつが変更できる設定)はないでしょうか。 非常にわかりにくく長い文章で申し訳ありません。 VBA等はさっぱりわかりませんので、普通の設定の範囲内で、できるかどうかよろしくお願いします。

  • access での値参照およびコピー

    はじめまして、 どなたかアクセス2007での処理方法を教えてください。 アクセス初心者です。よろしくお願いいたします。 以下のような3つのテーブルがあります。 salesテーブルはcsvファイルをインポートしたワークテーブルです。 テーブル名:sales(ワークテーブル) 受注番号 名前   住所 3   さぶろう 長野県 4   しろう  愛知県 ここから追加クエリで以下のテーブルにデータを追加しました。 (ID12と13、IDはオートナンバーです。) テーブル名:顧客マスター 顧客ID 名前 住所  10 たろう 東京都 11 じろう 神奈川県 12 さぶろう長野県 13 しろう 愛知県 そして以下のテーブルにも追加クエリでワークテーブルの情報を追加しました。 テーブル名:受注情報(受注番号3と4を追加) 受注番号 顧客ID  商品名 1    10   りんご(すでにあるデータ) 2    11   ばなな(すでにあるデータ) 3         りんご(今回ワークテーブルから追加したデータ) 4         みかん(今回ワークテーブルから追加したデータ) 上記の場合で、受注情報テーブルに顧客IDを挿入するには どのような方法で追加すればよいのでしょうか? ワークテーブルの中に顧客IDはないので単純な追加クエリでは できなのでどうやったらよいか分かりません。 (顧客テーブルと受注情報テーブルは結合されています。) 同姓同名を避けるためにsalesテーブルの名前&住所と顧客マスターテーブルの 名前&住所を比べて、同じものの顧客IDを受注情報テーブルの顧客ID欄に入れたいのです。 そうすると顧客テーブルと受注情報テーブルの顧客IDのリレーションシップに矛盾が 起きないのではないかと思っています。 よろしくお願いいたします。

  • 住所データの変換 こんなことできるソフト

    住所データが数千件ありますが、入力されている形式がバラバラです。 下記のように統一する方法、あるいは市販ソフト、フリーソフトなどはありますか ? 元のデータは CSV形式です。 元データの一例 郵便番号、東京都千代田区千代田1-1-1東京ビル1階、会社名 目的とするデータ 郵便番号、東京都千代田区神田、1-1-1、東京ビル1階、会社名 ポイントですが「都道府県から番地の前まで」と「番地以降の住所」と「建物名」を分けたいということです。なお、元データの郵便番号は正確に入っています よろしくお願いします。

  • マスタテーブルの変更履歴について

    データベースについて質問させていただきます。 例えば、飲食店で発行されるレシートには以下が記載されています。 ・店舗名、電話番号、担当者名 ・購入した商品名、値段、会計 これらを後に会社の業務で画面にレシートのような情報を表示したり、データの分析に使う場合、データベースを作成すると思います。 そのデータベースとしては、 以下のようなものが必要だと、私は考えました。 ・店舗テーブル…属性:店舗コード、店名、電話番号、住所など ・従業員テーブル…属性:従業員ID、名前、所属の店舗コード ・顧客テーブル…顧客ID、顧客名、住所、電話番号 ・商品テーブル…属性:商品ID、商品名、単価 ・売上履歴テーブル…属性:購入履歴ID、商品ID、個数、購入日時、顧客ID、購入した店舗コード、従業員ID これらを踏まえて、以下の質問をさせていただきます。 ・マスタの更新や別途、変更履歴テーブルが必要なのか…商品テーブルは日々属性の情報が変更されると思います。例えば、不況によって、単価が変わるなど。これをマスタテーブルの単価だけ変更する対応だとすると、購入履歴テーブルは商品テーブルを利用するので、単価の変更前に購入した履歴も値段が変更されてしまいます。この対応策として、別途、商品マスタの履歴テーブルを作って購入日時などを元に正しい単価を判断するような感じで対応すると良いのでしょうか? ・テーブルの作成や検索の都度、毎回結合するのか…例えば、Aさんの購入履歴を画面に表示する場合、画面にAさんの名前を入力して検索ボタンを押すと、購入履歴テーブルから必要なレコードを取り出して、Aさんの購入履歴を画面に表示するイメージをしています。この際、購入履歴テーブルは、商品IDを元に商品テーブルと結合したり、他には顧客テーブルと従業員テーブルとも結合する必要があります。検索をする際は、毎回テーブル結合を行うのでしょうか?それならば、見にくいイメージがありますが、購入履歴テーブルの顧客IDを名前にしておいたり、従業員IDを従業員の名前にしておくと、テーブルの結合が必要なくて良いのではないでしょうか? 大変文章が長く、また、読みにくいもので申し訳ございません。 たくさんの回答、よろしくお願いいたします。

  • PayPal 住所について

    PayPalの住所登録について教えて下さい。 Postal code  :郵便番号 Prefecture   :県 City       :町+市 Address Line1 :町域+番地 Address Line2 :アパート名 こんな感じで書いたんですが、登録住所の確認を英語表記で見ると 名前 町域+番地 アパート名 町+市、県、郵便番号 の並びになっています。 これは表記がバグってるだけなのでしょうか? それとも、正しくなるよう登録の修正が必要なのでしょうか? よろしくお願いします。

  • 郵便番号を書いて、きちんと住所も書きますか?

    郵便番号を書けば、基本的に番地だけで相手に届くシステムですが、それでも住所をきちんと書いていますか? 例えば都道府県とか市町村から、とか。 またそれはどうしてでしょうか。 相手に対して失礼になるからですか、それとも万一届かないかも知れないからですか、慣れているからつい書いてしまう?。