どのような登録の仕方・構造の仕方をするのが適切でしょうか?
自分にとって必要な構造にするだけです。
今回の場合だと、
検索フォームでは「都道府県」「市区町村」で検索したい
との事ですので、
都道府県, 市区町村, その他(地域・マンション名等)
の3カラムは欲しいということになります。
一般に検索は DB の INDEX が有効になるように設計する方が良いです。
文字列の場合たいていのDBは(MySQL 含む)完全一致か前方一致しか INDEX は使用されません。
つまり、
WHERE address = '東京都'
OK
WHERE address LIKE '東京都%'
OK
WHERE address LIKE '%東京都%'
NG
となります。
このように自分のサイトに合わせるのが基本ですが、よく見るパターンとしては、
郵便番号1, 郵便番号2, 住所1(都道府県), 住所2(市区町村), 住所3(マンション名等)
ぐらいでしょうか。
やはり、設計上1つのカラム内で住所をまとめるよりも、3カラムに分けた方が良いのでしょうか?
カラム数を出来るだけ少なくしたいのと、表示させる時に分かれているよりも1つにした方が便利だとおもったのと、
元データがエクセルで1つの住所としてまとめられているので、分けるのは難しいと思っていました。
(しかし、やはり設計上・検索上は分けた方が使い勝手が良いですよね。。)
都道府県は別テーブルを用意するか、PHP上に配列を初期設定しておき、
DBにはIDで登録するほうがいいと思いますよ。
文字列検索より、ID検索のほうが速いですから。
一応、フォームから都道府県を入力する時は、郵政の住所録CSVを参照してAJAXで自動入力するようにしています。ID登録だと、その住所録のIDを登録するイメージかと思うのですが、「番地・建物名以下」の住所を保存する時はどうしたらいいのでしょうか?それは日本語のまま保存すると言うことでしょうか?
番地・建物名以下 は日本語のままです。
わかりました
>元データがエクセルで1つの住所としてまとめられているので、分けるのは難しいと思って
>いました。
これが一番重要な仕様のだと思いますが。
実際分けれるのなら分けたいところですけど、無理かどうかがまず問題かと。
---------------
回答2の方式だと、合併とかがあったときにややこしいので、
>郵便番号1, 郵便番号2, 住所1(都道府県), 住所2(市区町村), 住所3(マンション名等)
のように 住所1、 住所2は別にもっておいたほうが良いと思いますよ。
やはり細かく分けた方が良いですよね。住所1・住所2と日本語でも分けると、
後からJOINで都道府県コードが入っているテーブルと結合出来ますし。
住所を分けるのも正規表現を使えば出来るので、もう少し元データを見直して工夫してみます。