0

国、地域、町のテーブルを関連付けるための最良の方法を見つけようとしています。

私のウェブサイトでは、ユーザーが町に入るだけでいいようにしたいと思っています。次に、オプションで国と地域を入力します。どちらも入力する必要があるか、まったく入力しない必要があります。

現在、私のテーブルはそのようなものです

tbl>ユーザーはtownID(FK)を持っています

tbl> town has id(PK)townName regionID(FK DEFAULT NULL)

tbl> region has id(PK)regionName countryID(FK NOT NULL)

tbl>国にはid(PK)countryNameがあります

私はおそらくユーザーと町の関係をさらに吐き出すと思いました:

tbl> User has locationID(FK)
tbl> location has id(PK)townID(FK)regionID(FK)countryID(FK)

しかし、それは不要であり、問​​題をさらに複雑にしていると思いますか?

国データベースはすでに入力されています。ユーザーが入力した町>地域>国の関係についての独自の参照を作成するつもりです。したがって、ユーザーが地域と国のない町に入ると、地域IDのない同じ名前の町がまだない場合は、regionIDのないtbl>townに入力されます。これは、ユーザーが地域と国のIDを入力した町でも同じです。入る前に、町>地域>国の関係がすでに存在していないことを確認するだけです。サイトの開発の後半で、ユーザーが入力した町に基づいて国/地域のAjax提案を提供します。

だから質問に:

データが重複したり、データが上書きされたりする可能性があるなど、これに関する落とし穴を想像することができます。私の希望する方法に合うようにテーブルを構築するためのより良い方法はありますか?

これは前の質問で答えられるかもしれません:しかし、テーブルのPHP処理を減らすために私ができることはありますか。もちろん、PHPステートメントを1つだけ挿入したいのですが、一度に挿入するには注意点が多すぎると思います。

また、ユーザーの町のエントリはnullである可能性があり、地域への外部キー参照が含まれる場合と含まれない場合があるため、それを考慮したビューを作成するのに最適な方法はありますか?

ホストされるので、MySQL関数は使用しません。

説明が必要な場合はお知らせください。続行する前に、これを最初に正しく理解したいので、あなたの助けは非常に貴重です。

4

2 に答える 2

0

あまりにも明示的であるため、コードを減らすことはないと思います。あなたはそれを変えることができます、しかしそれは良くなりません。

于 2011-02-19T03:57:52.697 に答える
0

地域や国を除いて町の名前を受け入れることは、誰かにミドルネームやラストネームを付けずにファーストネームを入力させるようなものです。これはデータですが、識別子ではありません。

フラートンのフルネームは「米国カリフォルニア州フラートン」です。Fullertonのフルネームを必要としないことにより、データの整合性のために外部キーを放棄します。(「米国カリフォルニア州フラートン」は都市ですが、「米国アラバマ州フラートン」はそうではありません。)それで頑張ってください。

この道を進んでいる場合、私が提供できる最善のアドバイスは、ID番号を取り除くことです。ISOは、国および国の下位区分の標準コードを公開しています。ウィキペディアで調べることができます。自然キーを保存すると、結合の数が3から0に減ります。ゼロ結合は、ほとんどの場合、3つの結合を実行します。

ビューを作成するには、おそらく外部結合を使用する必要があります。

于 2011-02-19T11:21:50.037 に答える