地名のテーブル構造について

このQ&Aのポイント
  • 地名のテーブル構造について、MySQL Version 5.1.41を使用します。テーブル「area」に地名データを格納し、上位概念のデータが必要な場合には新たなテーブルを作成し、外部キーを追加する方法が考えられます。上位概念のデータがさらに変更や追加される場合には、適宜テーブルを追加して関連付けることで柔軟に対応できます。
  • 例えば、テーブル「grouparea」を追加することで、地名データをより包括的なカテゴリで管理できます。さらに、上位概念のエリアや都道府県を追加する場合には、それぞれのテーブルを作成し、関連付けていくことで階層的な地名データの管理が可能です。
  • ただし、このようなテーブルの変更や追加は、データベースの設計やアプリケーションの仕様に合わせて検討する必要があります。適切な関係性やインデックスの設定、クエリの最適化なども考慮しましょう。
回答を見る
  • ベストアンサー

地名のテーブル構造について

MySQL Version 5.1.41 このジャンルでお願いします。 例えば地名を格納する テーブル「area」 +------+-------+ | id | name | +------+-------+ | 1 | 渋谷1丁目| +------+-------+ | 2 | 渋谷2丁目| +------+-------+ があったとします。 次にその上位?(これらの丁目を包括する)データが必要なった場合に 新たにテーブルを作ってその外部キーをテーブル「area」に新たに追加する方法が良いのでしょうか? テーブル「grouparea」 +------+-------+ | id | name | +------+-------+ | 1 | 渋谷区| +------+-------+ テーブル「area」←このテーブルの列構造をその都度変える +----+---------------+-----------+ | id  | grouparea_id  |   name  | +-----+-------------+-----------+ | 1  |      1    | 渋谷1丁目| +-----+-------------+-----------+ | 2  |      1    | 渋谷2丁目| +-----+-------------+-----------+ でもこれだとさらにその上位概念のエリア「東京」や「東京」は 「関東」、あるいは「東日本」といった具合に追加したくなった場合に、 順番的に「grouparea」テーブルの先に「ken」テーブルを追加してて 後に「grouparea」テーブルを追加したくなったら テーブル「ken」 +------+-------+ | id | name | +------+-------+ | 1 | 東京都| +------+-------+ テーブル「area」 +----+---------------+-----------+ | id  |     ken_id  |   name  | +-----+-------------+-----------+ | 1  |      1    | 渋谷1丁目| +-----+-------------+-----------+ | 2  |      1    | 渋谷2丁目| +-----+-------------+-----------+ 次に「grouparea」テーブルを追加したくなったら テーブル「ken」 +------+-------+ | id | name | +------+-------+ | 1 | 東京都| +------+-------+ テーブル「grouparea」 +----+---------------+-----------+ | id  |     ken_id  |   name  | +-----+-------------+-----------+ | 1  |      1    | 渋谷1丁目| +-----+-------------+-----------+ テーブル「area」 +----+---------------+-----------+ | id  | grouparea_id  |   name  | +-----+-------------+-----------+ | 1  |      1    | 渋谷1丁目| +-----+-------------+-----------+ | 2  |      1    | 渋谷2丁目| +-----+-------------+-----------+ このような変更しなくてはいけないですよね?(このような変更が可能なのかは分かりませんが・・・) 自分的にはこのやり方は違うような気がするのですが、 なにか良いやり方や考え方があればアドバイス頂けないでしょうか?

  • MySQL
  • 回答数2
  • ありがとう数6

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

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.2

いっそ、ファイルシステムのディレクトリの様なツリー構造と考えてしまって上位のIDを保持するようにしてはどうですか? 例) テーブル「area」 +----+----------+---------+ | id | name    | upper_id | +----+----------+---------+ | 1 | 関東    | (null)  | +----+----------+---------+ | 2 | 東京都   | 1     | +----+----------+---------+ | 3 | 渋谷1丁目 | 2     | +----+----------+---------+ | 4 | 渋谷2丁目 | 2     | +----+----------+---------+ 構造的には、県の上位に市を設定したり、自分自身のIDを上位IDに設定する事も出来てしまいますから、そこら辺はアプリケーション側で管理する必要が有りますが。 さらに地域の種別を表すコードのカラムを設けて、どの階層かを管理しても良いかも知れません。

参考URL:
http://www.geocities.jp/mickindex/database/db_tree_ns.html
takagoo100
質問者

お礼

ご回答ありがとうございます。 なるほど、上位IDの階層構造ですね。 それにroot139さんが仰るように種別のIDを持たせるのが 今のところ現実的な感じですね。 参考になりました。

その他の回答 (1)

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

たとえば、隣の家に電話する場合、市内局番-番号ですが、 離れた県になると市外局番-市内局番-番号に、 外国になるとさらに番号が必要ですよね。 それと似ているかな。 携帯番号が10桁で足りなくなって11桁に一斉に変更になりました。 それもどんどん足りなくなってきています。 その都度大改定が必要になります。

takagoo100
質問者

お礼

ご回答ありがとうございます。 たしかにちょっとした変更じゃ対応できなそうな気がします。

関連するQ&A

  • 他のテーブルからの値の挿入

    テーブル「t1」 「id 1」「name ken」「val 0」 「id 2」「name taro」「val 0」 テーブル「t2」 「id 1」「name ken」「val1 100」「val2 10」 「id 2」「name ken」「val1 300」「val2 5」 「id 3」「name taro」「val1 200」「val2 10」 という2つのテーブルがあった時に、t1の「name ken」に t2の「name ken」のval1にval2を100で割った値のそれぞれを加えたいのですが 1つのSQL文であらわすとどのようになるのでしょうか? t1の「name ken」のvalに t2の「id 1(name ken)」(val1(100) × (val2(10) ÷ 100))と t2の「id 2(name ken)」((val1(300) × (val2(5) ÷ 100)) を加えたいのです。

    • ベストアンサー
    • MySQL
  • 複数テーブルをまとめてソート

    たとえば次のような、都道府県ごとのテーブルがあり、 ID、名前、得点の列があるとします。 テーブル1(テーブル名:tokyo) ID NAME SCORE 1 yamada 89 2 tanaka 45 テーブル2(テーブル名:osaka) ID NAME SCORE 1 sato 65 2 suzuki 22 これらのテーブルをまとめて、全国で得点が上位順に並べたいと 思っております。また、結果にはどのテーブルに所属するものかを 判別する列を追加したいのですが、どういう文を記述したらよいのでしょうか? 望みの結果は次のようなものです。 NAME SCORE TABLE_NAME yamada 89 tokyo sato 65 osaka tanaka 45 tokyo suzuki 22 osaka よろしくお願いします。

    • ベストアンサー
    • MySQL
  • データベース ー どういうテーブル構造にしますか?

    管理者テーブル table admin admin int, adm_name text 商品テーブル table items item_id int, item_name text, item_price int と2つのデータテーブルがあった場合に 、誰がいつどんな変更をしたかを記録を取りたい場合、あなたならどういうふうに作りますか? itemsテーブルにカラムを増やしますか? 別テーブルでログ用のテーブルを増やしますか?

  • 東京の地名と同じ街

    ある方の質問に答えようとして、ふと忘れていることに築いたんですが、、、、 たしか九州に戦後区画整理か何かのときに町長?が 「どうせなら東京都とおなじ地名を使え!」 と、銀座、六本木、渋谷、などという地名を つけたという話を聞いたのですが、遺憾背の馬鹿なもので、どこのことだか忘れてしまいました。 どなたか詳しい方、ずばり、回答をお願いします!

  • テーブルの結合について

    親テーブルに対して子テーブルが複数あるときの結合方法がわかりません。 テーブル2、3はそれぞれマスタテーブルの値を格納しています。 具体的には4つのテーブルを結合しテーブル1のname項目、テーブル2のtest項目、area_id、pref_idで検索をしたいです。 right joinで結合してみましたが、テーブル3、4でテーブル2のtest_idを2回参照するのでエラーがでてから先に進めない状況です。 他の回答を読んだのですができなかったので質問させてください。 お分かりの方教えてください。 よろしくお願いいたします。 [teble1] ID | name 1 佐々木 2 鈴木 3 田中 [teble2] test_id | ID(table1の値) | test 1 1       テスト1 2 1       テスト2 3 2       テスト3 [teble3] test_id | area_id 1    1 1    4 2    3 [teble4] test_id | pref_id 1    1 2    2 2    5 3    2 バージョンは4.0.27です。

    • ベストアンサー
    • MySQL
  • アクセスではうまく行くのにMYSQLではうまくいきません。

    いつもありがとうございます。初心者です。どうか教えて下さい。 テーブル area フィールド area_id, area_name テーブル pref フィールド pref_id, pref_name, area_id テーブル city フィールド city_id, city_name, pref_id というように3つのテーブルがあり、それぞれarea_id,pref_id,city_id を主キーにして 結合して表示したいのですが、エラーになります。 SQL文は次のように書きました。 SELECT area.area_id, area.area_name, pref.pref_id, pref.ken_name, city.city_id, city.pref_id FROM area INNER JOIN (pref INNER JOIN city ON pref.pref_id = city.pref_id) ON area.area_id = pref.area_id するとエラーメッセージで #1064 - You have an error in your SQL syntax near '(pref INNER JOIN city ON pref.pref_id = city.pref_id) ON area.area_id = pref.are' at line 2 のように表示されます。 マイクロソフトのアクセスですると問題なく表示されるのですが、 MYSQLではうまく行きません。どうか御指導をお願い致します。

    • ベストアンサー
    • MySQL
  • クエリの書き方

    Oracle11gを使用しています。以下のような3つのテーブルがあります。 (1)駅マスタテーブル create table tbl_station ( ID NUMBER PRIMARY KEY, Name varchar2(32), ); (2)レストランマスタテーブル create table tbl_restaurant ( ID NUMBER PRIMARY KEY, Name varchar2(32), ZipCode varchar2(8), Prefecture varchar2(32), City varchar2(32), StreetAddress varchar2(64), PhoneNumber varchar2(20), NearestStation NUMBER, constraint fk1_tbl_restaurant foreign key (NearestStation) references tbl_station(ID) ); (3)評価トランザクションテーブル create table tbl_gradings ( RestaurantID NUMBER, UserID varchar2(255), Gradings NUMBER, Primary Key (RestaurantID, UserID), constraint fk1_tbl_gradings foreign key (RestaurantID) references tbl_restaurant(ID), constraint fk2_tbl_gradings foreign key (UserID) references EXTERNALUSERTBL(EXTERNALTBLUSERID) ); 以下のようにデータを入力してみました。 (1)駅マスタテーブル ID, Name 1, 新宿 2, 渋谷 3, 銀座 (2)レストランマスタテーブル ID, Name, ZipCode, Prefecture, City, StreetAddress, PhoneNumber, NearestStation 1, レストラン1, 100-1000, 東京都, 新宿区, 西新宿1-1-1, 03-1111-1111, 1 2, レストラン2, 300-3000, 東京都, 中央区, 銀座1-1-1, 03-3333-3333, 3 3, レストラン3, 100-1001, 東京都, 新宿区, 東新宿1-1-1, 03-1111-2222, 1 4, レストラン4, 200-2000, 東京都, 渋谷区, 渋谷1-1-1, 03-2222-2222, 2 (3)評価トランザクションテーブル RestaurantID, UserID, Gradings 1, User1, 5 1, User2, 3 2, User1, 5 このような場合に、以下のようなデータを出力するクエリを書きたいのですが、書き方がわかりません。 内容:全てのレストラン情報を評価の平均値とともに重複なく表示。 出力イメージは以下のようなものです。 ID, レストラン名, 郵便番号, 都道府県, 市区町村, 町名番地, 電話番号, 最寄駅, 平均評価 1, レストラン1, 100-1000, 東京都, 新宿区, 西新宿1-1-1, 03-1111-1111, 新宿, 4 2, レストラン2, 300-3000, 東京都, 中央区, 銀座1-1-1, 03-3333-3333, 銀座, 5 3, レストラン3, 100-1001, 東京都, 新宿区, 東新宿1-1-1, 03-1111-2222, 新宿 4, レストラン4, 200-2000, 東京都, 渋谷区, 渋谷1-1-1, 03-2222-2222, 渋谷 最寄駅名、評価を出力することから3テーブル全てを結合し、さらにAVG関数を使って平均の評価値をレストラン毎に計算する必要があり、僕には難しいです。。おわかりの方、宜しくお願いします。

  • テーブルを再編集するには

    PostgreSQL7.1.3 RedHatLinux7.2 create table でtestというテーブルを作りまして、ID、nameというフィールドを作り、主キーをIDに設定しました。このテーブルにtelというフィールドを追加したいのですが、テーブルを編集するコマンドがわかりません。 また、testテーブルにいつくかデータを入力したのですが、そのデータがちゃんと入っているかどうか確認するコマンドも知りたいです。 宜しくお願いします!

  • 車のナンバー変更(地名)について

    神奈川県在住で今は横浜ナンバーですが、東京都武蔵村山市に家を購入することになり住所変更すると、車のプレートの地名は何になりますか。ご教示ください。

  • 階層構造のテーブルの行の取得について

    このジャンルでお願いします。 次のようなテーブルで CREATE TABLE IF NOT EXISTS user ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(32) NOT NULL, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO user (name) VALUES ('user1'); INSERT INTO user (name) VALUES ('user2'); INSERT INTO user (name) VALUES ('user3'); CREATE TABLE IF NOT EXISTS item ( id int(11) NOT NULL AUTO_INCREMENT, parent_id INT, name varchar(32) NOT NULL, FOREIGN KEY (parent_id) REFERENCES item(id) ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO item (parent_id, name) VALUES (null, 'item1'); INSERT INTO item (parent_id, name) VALUES (1, 'item2'); INSERT INTO item (parent_id, name) VALUES (2, 'item3'); INSERT INTO item (parent_id, name) VALUES (3, 'item4'); INSERT INTO item (parent_id, name) VALUES (2, 'item5'); INSERT INTO item (parent_id, name) VALUES (null, 'item6'); INSERT INTO item (parent_id, name) VALUES (6, 'item7'); INSERT INTO item (parent_id, name) VALUES (null, 'item8'); CREATE TABLE IF NOT EXISTS user_item ( id int(11) NOT NULL AUTO_INCREMENT, user_id INT, item_id INT, type varchar(16) NOT NULL, PRIMARY KEY(id), FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (item_id) REFERENCES item(id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO user_item (user_id, item_id, type) VALUES (1, 1, 'allow'); INSERT INTO user_item (user_id, item_id, type) VALUES (1, 3, 'deny'); INSERT INTO user_item (user_id, item_id, type) VALUES (1, 7, 'allow'); user_itemのuser_idが1のitemの行を取得したいのですが、 その条件として ・user_itemテーブルのtypeが'allow'のitem_id以下のitemの行 ・ただしtypeが'deny'のitem_id以下の行は除く この例だと、user_itemの INSERT INTO user_item (user_id, item_id, type) VALUES (1, 1, 'allow'); の行によってitemテーブルの INSERT INTO item (parent_id, name) VALUES (null, 'item1'); INSERT INTO item (parent_id, name) VALUES (1, 'item2'); INSERT INTO item (parent_id, name) VALUES (2, 'item3'); INSERT INTO item (parent_id, name) VALUES (3, 'item4'); INSERT INTO item (parent_id, name) VALUES (2, 'item5'); が取得候補になりますが、 INSERT INTO user_item (user_id, item_id, type) VALUES (1, 3, 'deny'); によって INSERT INTO item (parent_id, name) VALUES (2, 'item3'); INSERT INTO item (parent_id, name) VALUES (3, 'item4'); の行は除かれ、 INSERT INTO item (parent_id, name) VALUES (null, 'item1'); INSERT INTO item (parent_id, name) VALUES (1, 'item2'); INSERT INTO item (parent_id, name) VALUES (2, 'item5'); の行が取得されます。 つまりitemテーブルにおいて上の階層の直近の(user_itemと結合して取得した)typeが 'allow'である場合のみ取得したいのです。 INSERT INTO item (parent_id, name) VALUES (null, 'item1');←取得 INSERT INTO item (parent_id, name) VALUES (1, 'item2');←取得 INSERT INTO item (parent_id, name) VALUES (2, 'item3'); INSERT INTO item (parent_id, name) VALUES (3, 'item4'); INSERT INTO item (parent_id, name) VALUES (2, 'item5');←取得 INSERT INTO item (parent_id, name) VALUES (null, 'item6'); INSERT INTO item (parent_id, name) VALUES (6, 'item7');←取得 INSERT INTO item (parent_id, name) VALUES (null, 'item8'); 複雑ではありますが、これはどのようなSQL文にすれば良いのでしょうか?

    • ベストアンサー
    • MySQL