2010-12-14 24 views
0

は、私は次があるとします。の記憶領域/都市データは

私のユーザーテーブルで

表のregion_city

id name   parent_id 
============================== 
1  North   null 
2  South   null 
3  Manchester  1 
4  London   2 

私は、ユーザーがであることを市のIDを格納し

私の検索フォームでは、トップレベルの検索を実行できる必要があります。つまり、特定の地域(北または南)に属するすべてのユーザーを検索する必要があります。

私のユーザーテーブルにregion_idフィールドを含めると、それは簡単になりますか?それとも正規化の概念に反するのでしょうか?

+0

リージョン内に階層レベルが増えると思われますか? –

+0

いいえ、リージョンと都市の2つのレベルしかありません。 – GSTAR

答えて

2

テーブル構造を非正規化し、データ更新の異常を導入する可能性があります。ユーザーがマンチェスターからロンドンに移動し、city_idが変更されたとします。 region_idはまだ北を指している可能性があります。

region_id は都市に依存するため、ユーザーテーブルには属しません。それは都市から派生することができるからです。

+0

真ですが、region_idは、city_idと同時に更新されます。私は懸念を理解する。もし私がcity_idだけを保存したら、これは確かに地域検索をもっと複雑にしてくれるでしょうか? – GSTAR

+0

正規化は複雑さではなく、データの一貫性についてです:-)それはあなたの人生を楽にしてくれることに依存しています...誰でも正規化が*難しいという議論をすることができます。すべてのデータを1つの大きなテーブルに入れるだけです。それは最初に最も簡単になるでしょう... –

+0

@GSTAR:正規化は、保証された正確さと引き換えにある程度の複雑さをもたらします。 –

0

デザインが2つのレベル(地域と都市)のみを必要とし、今後別のレベルの追加を控える意思がある場合(決定する意思はありませんが、私の場合よりも)、あなたのuserテーブルにregionIDを含めないでください。あなたのデータベースを非正規化します。代わりに、データを表すためのいくつかの選択肢があります(関連する2つの関連テーブル、地域および都市を含む)。ユーザーテーブルに市のテーブルをジョインするか、検索でIN句を使用して検索を実行します。

関連する問題