MySQLのテーブル構造+PHPでの表示についての相談です。


会員情報などで「住所」を保存する時、「address」というフィールドを作って、そこに都道府県・市区町村・番地のフォームから入力した値を、結合して入れるようにしています。

MySQLで出力する時、「東京都で絞り込み」などをする場合は、
WHERE address LIKE '%東京都%'
のような形で絞り込みをしています。

これ自体は特に問題なく出来るのですが、日本語のまま登録すると、改ページ処理の時のURLが長くなりますし、他のサイトを見ると、地域コード・郵便番号で検索するパターンが多いです。


そこで相談ですが、どのような登録の仕方・構造の仕方をするのが適切でしょうか?
皆様が会員制サイト・ポータルサイトを作る上での、住所のデータ構造を教えていただければと思います。

※条件として、運営サイトの検索フォームでは「都道府県」「市区町村」で検索したいとします。

回答の条件
  • 1人2回まで
  • 登録:2007/10/18 01:58:35
  • 終了:2007/10/19 23:37:04

回答(4件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402007/10/18 08:59:48

ポイント40pt

どのような登録の仕方・構造の仕方をするのが適切でしょうか?

自分にとって必要な構造にするだけです。


今回の場合だと、

検索フォームでは「都道府県」「市区町村」で検索したい

との事ですので、

都道府県, 市区町村, その他(地域・マンション名等)

の3カラムは欲しいということになります。


一般に検索は DB の INDEX が有効になるように設計する方が良いです。

文字列の場合たいていのDBは(MySQL 含む)完全一致か前方一致しか INDEX は使用されません。

つまり、

WHERE address = '東京都'

OK

WHERE address LIKE '東京都%'

OK

WHERE address LIKE '%東京都%'

NG

となります。


このように自分のサイトに合わせるのが基本ですが、よく見るパターンとしては、

郵便番号1, 郵便番号2, 住所1(都道府県), 住所2(市区町村), 住所3(マンション名等)

ぐらいでしょうか。

id:kt26

やはり、設計上1つのカラム内で住所をまとめるよりも、3カラムに分けた方が良いのでしょうか?

カラム数を出来るだけ少なくしたいのと、表示させる時に分かれているよりも1つにした方が便利だとおもったのと、

元データがエクセルで1つの住所としてまとめられているので、分けるのは難しいと思っていました。

(しかし、やはり設計上・検索上は分けた方が使い勝手が良いですよね。。)

2007/10/18 10:02:52
id:shotets No.2

堺ちゃん回答回数42ベストアンサー獲得回数22007/10/18 10:39:58

ポイント23pt

都道府県は別テーブルを用意するか、PHP上に配列を初期設定しておき、

DBにはIDで登録するほうがいいと思いますよ。

文字列検索より、ID検索のほうが速いですから。

id:kt26

一応、フォームから都道府県を入力する時は、郵政の住所録CSVを参照してAJAXで自動入力するようにしています。ID登録だと、その住所録のIDを登録するイメージかと思うのですが、「番地・建物名以下」の住所を保存する時はどうしたらいいのでしょうか?それは日本語のまま保存すると言うことでしょうか?

2007/10/18 16:58:11
id:shotets No.3

堺ちゃん回答回数42ベストアンサー獲得回数22007/10/18 20:34:28

ポイント22pt

番地・建物名以下 は日本語のままです。

id:kt26

わかりました

2007/10/18 21:08:29
id:KUROX No.4

KUROX回答回数3542ベストアンサー獲得回数1402007/10/19 22:16:46

ポイント22pt

>元データがエクセルで1つの住所としてまとめられているので、分けるのは難しいと思って

>いました。

これが一番重要な仕様のだと思いますが。

実際分けれるのなら分けたいところですけど、無理かどうかがまず問題かと。

---------------

回答2の方式だと、合併とかがあったときにややこしいので、

>郵便番号1, 郵便番号2, 住所1(都道府県), 住所2(市区町村), 住所3(マンション名等)

のように 住所1、 住所2は別にもっておいたほうが良いと思いますよ。

id:kt26

やはり細かく分けた方が良いですよね。住所1・住所2と日本語でも分けると、

後からJOINで都道府県コードが入っているテーブルと結合出来ますし。


住所を分けるのも正規表現を使えば出来るので、もう少し元データを見直して工夫してみます。

2007/10/19 23:36:25
  • id:shotets
    設計上や検索上だけじゃなく、表示の際も細かく分けられていたほうが良いです。
    例えば、一覧表示では都道府県のみ表示させるとか、
    自由度が膨らみます。
  • id:kt26
    表示の際は正規表現を使って区切ってます。故に現在は住所を1つのカラムで管理して、
    出力時に部分表示出来るようにしていました。
  • id:b-wind
    要求仕様は要求から導かれる。
    都道府県等での検索頻度が低いなら今の状態で問題ないし、検索速度が要求されるなら分けるべき。
    極論すると現状検索速度で困っていないのなら今のままでもいい。
    (そのほかの問題を無視すれば、ですが)

    >分けるのは難しいと思っていました。
    とのことですが、
    >表示の際は正規表現を使って区切ってます。
    ここまで出来ているならさほど難しくないのでは?
    手間はかかるでしょうけど。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません