2010-12-31 10 views
1

例1:"国"、 "都道府県"、 "市"テーブルの設計方法は?

xTable: xTableID, CountryName, PovinceName, CityName 
  • OR

実施例2:

Country: CountryID, CountryName 
Province: ProvinceID, ProvinceName 
City: CityID, CityName 

質問:

  1. アプリケーションレベルで国、都道府県、市区町村のリストを入力して、例1のデザインを使用することをお勧めしますか?または、例2のようにDBレベルに入力する必要がありますか?

  2. 都道府県(該当する場合)または国名に基づいて市が表示されます。州(もしあれば)は選ばれた国に基づいて表示されます。州は1つの国のみになり、都市は1つの州/国のみになります。多くの関係に多くの誰が/ので、私は

NOTE以下のように設計されていない:すべての国が確かに街がありますが、すべての国が都道府県名を持つことになりません。

Country: CountryID (PK), CountryName 
Province: CountryID (PK - FK), ProvinceName 
City: CountryID (PK - FK), CityName 

答えて

2

市から国、州から国、市から州への直接的な関係が必要です。 すべての州は国にあるため、州表にはFKとしてCountryIDが必要です。同様に、すべての都市はカントリーにあり、そこにも同じです。 すべての国に州と呼ばれる地域があるわけではないので、都市から国へのナビゲートには使用できません。 ProvinceIDはCityテーブルにある必要がありますが、NULL値を許可してください。

州を持たない国では、バーチャル州(例:州名=いいえ)を設定し、都市と国を関連付けることができます。それは、州がある国にあった都市があったとしても、それは州には存在しなかった(もしそのようなものが存在すれば、おそらく州は都市である)。

+0

私は別の提案を思いつきました。 ID、CountryID、ProvinceID、CityIDという列を持つ新しいテーブルを作成します。私はこれが多対多の関係を満たしていることを知っていますが、扱いが容易です。記載されたデザインに関するコメントはありますか? – user311509

+0

私はそれが大好きだとは言えません。エンティティ間の厳密な関係を維持することがどれほど重要であるかによって異なります。テーブルデザインは、Cityが複数の国に関連することを制限するものではありません。プログラムを使用するとエラーが発生する可能性があります。厳密な関係を維持するためにDBを使用したい場合は、これを行う方法ではありません。その一方で、いくつかのコードを起動して実行するための迅速かつ厄介な修正に興味があれば、おそらくあなたのCityIDがプライマリキーである必要があります。だから私は上記の2つのソリューションのいずれかと一緒に行くだろう。 –

+1

サイドノート:Country&Provinceの選択に基づいてフィルタのドロップダウン値などのデータを使って何かをしたいと思っています。分岐コードを避けるために、仮想州ソリューション(州を持たない各国ごとに架空の州が作成されています)が最もシンプルになります。国が想像上の都道府県のみを持っているかどうかをチェックし、その都道府県のドロップダウンを無効にすることもできます。国が1つの州(虚偽か否か)がある場合は、都市ドロップダウンをあらかじめロードすることもできます。 –

0

およびCityIdを州および市の表に変更します。州は多くの都市を持つことができ、同様に国は多くの州を持つことができます。 countryIdを都市に保つ必要はなく、ProvinceIが国ではなくトリガされるので、州は十分です。

+0

すべての国が、地方と呼ばれることができる区画を持っているわけではありません(バチカン市国を考える)。同様に、他の郡には複数のレベルの細分化があります(たとえば、イギリス:構成国は郡に分かれています)。 – Richard

関連する問題