0

私は次のlocations表を持っています:

----------------------------------------------------------
| ID | zoneID | storeID | address | latitude | longitude |
----------------------------------------------------------

phonesテーブル:

-----------------------
| locationID | number |
-----------------------

さて、どんな寄付店でも、最大5つの電話番号が一番上になる可能性があることに注意してください。順序は関係ありません。

最近、電話番号も含む店舗関連情報を含む別のテーブルを追加する必要がありました。

現在、この新しいテーブルにはlocationIDが適用されていないため、前の電話テーブルに電話を保存することはできません。

DBを正規化しておくには、最終的に、データを取得するために2つの新しいテーブルと合計4つの結合が必要になります。非正規化すると、古いテーブルは次のようになります。

----------------------------------------------------------------------------------
| ID | zoneID | storeID | address | latitude | longitude | phone1 | ... | phone5 |
----------------------------------------------------------------------------------

合計2つのテーブルと2つの結合があります。

大きな苦痛になる可能性があるので、私はフィールドを持つdata1のが好きではありません。だから、あなたの意見は何ですか。data2data3

4

3 に答える 3

7

私の意見では、非正規化は、実際にパフォーマンスの問題が発生した場合にのみ、パフォーマンスを向上させるために行うことです。私は常に3NF用に設計し、どうしても必要な場合にのみ元に戻します。

クエリの見栄えを良くするために行うことではありません。まともなデータベース開発者なら誰でも、適度に複雑なSQLステートメントを恐れることはありませんが、私に震えを与えた数百行のステートメントを見たことがあることを認めなければなりません-覚えておいてください、これらはスキーマを制御できない顧客からのものでした: DBAは、このような怪物を避けるために、最初にスキーマを再設計していました。

ただし、非正規化によって課せられる制限に満足している限り、好きなことを行うことができます。違反者を探して惑星を歩き回っている3NF警察のバンドがあるようではありません:-)

私が見ることができる当面の制限(他にもあるかもしれません)は次のとおりです。

  • 場所ごとに5つの電話番号に制限されます(最初はスキーマを変更しません)。あなたの説明から、これを問題と見なしているようには見えません。
  • そこにある必要のないデータを保存するスペースを無駄にします。つまり、すべての行は、実際の数値に関係なく5つの数値にスペースを使用しますが、この影響はおそらく最小限です(たとえば、varcharでnull許容型の場合)。
  • 5つの異なる列をチェックする必要があるため、電話番号を検索するためのクエリは複雑になります。それがあなたのユースケースの1つであるかどうかはわかりませんので、関係ないかもしれません。

ただし、おそらくどちらかの方法を選択する必要があります(それがここでの意図かどうかはわかりません)。ストアテーブルと別の電話番号テーブルの両方に電話番号があるスキーマに出くわした場合、特にそれらが互いに一致しなかった場合は、特にイライラします。非正規化する場合でも、データの一貫性を維持するために挿入/更新トリガーを使用する傾向があります。

于 2010-09-06T00:56:36.863 に答える
4

あなたの問題は間違ったモデルに起因していると思います。

なぜロケーションIDとストアIDがあるのですか?店舗は複数の場所を占めることができますか?電話番号は地理的な場所に関連付けられていますか?

StoreIdですべてをキー入力するだけで、問題は解消されます。

于 2010-09-06T01:28:04.427 に答える
0

新しいテーブルを古いロケーションテーブルと関連付けてみてください。両方のテーブルは、両方を関連付けるために何らかの方法で見つけることができるはずのストアを表しているためです。あなたがそれをすることができればあなたの問題は解決されます、なぜならあなたは以前のように電話テーブルを使い続けることができるからです。

新しいテーブルを古いロケーションテーブルに関連付けると、電話番号を取得するだけでなく、

于 2010-09-06T01:13:29.243 に答える