0

この方法で場所を保存するデータベースを作成する必要があります。

countries: id, name
regions: id, name, countries_id
municipality: id, name, regions_id

同じデータベースには、この場所に関連する他のテーブルがあります。問題は、自治体 (最も具体的な場所の値) が常にわかっているとは限らず、地域または国しかわかっていない場合があることです。したがって、次のように残りのテーブルを作成する必要があります。

user: id, name, municipality_id, regions_id, countries_id

このスキームには、関係の重複による問題があります。ユーザーは地域や国に関連付けることができますが、この地域は国にも関連付けられています。

この問題を処理する最善の方法は何ですか? 考えられる解決策は次のようなものです。

ユーザー: ID、名前、place_table、place_id

ただし、この方法では外部キーを使用できず、クエリを作成するのが少し難しくなります。

4

1 に答える 1

0

userテーブルに 3 つのフィールドを格納する必要はありません。これにより、一貫性の問題が発生します。

解決策の 1 つは、現在のテーブル構造を維持し、自治体テーブルを拡張して地域と国を含めることです。したがって、各地域と各国がテーブルに表示されます。「国」自治体 (たとえばフランス) は「フランス」地域を指し、それは「フランス」国を指します。

私の好ましい解決策は、テーブルを1つだけにすることです。これにより、構造が非正規化されます。ただし、この階層は実際には (たとえあったとしても) あまり変化しないと想定されています。3 つのテーブルの代わりに、 、、、 、 のようなPlaces列を持つ のようなテーブルを作成します。idnametypemunicipality_nameregion_namecountry_name

これは、正規化されたデータベースの「粒度に反する」ことを認識しています(ただし、次元分析の次元に対応します)。値が変化しないと仮定すると、データを非正規化すると、データの維持に多くのオーバーヘッドを課すことなく、おそらく最も単純なデータ構造とクエリが生成されます。

編集:

あなたのコメントは、上記の複数の列を含むテーブルについて説明していると思います。ユーザーがそのようなテーブルから郡を選択できるようにする場合は、 を使用しますselect distinct country_name from Places。国のすべての地域が必要な場合は、 user select distinct region_name from Places where country_name = XXX.

于 2013-09-07T14:06:45.660 に答える