2

学校や大学に関するデータを保存する必要があります (語学コースなどのエンティティも計画されています)。

保存する必要があるデータのリスト:

  • 利用可能な学習プログラム
  • 宿泊施設の可能性
  • 特別食の入手可能性

そこで、学校と大学用のテーブルを作成しました。

Place (place_id, name, city_id ... )
School (place_id (FK), school_type ...)
University (place_id (FK), ... )

オプションの表:

Accomodation (accomodation_id, name, description ...)
Activity (activity_id, name, category ...)
...

そして、それが複数のオプションになる可能性が常にあるので、私はそれらを次のような表で結び付けました:

Accomodation_to_place (place_id, accomodation_id)
...

しかし、この全体からデータを更新したり、取得したりするのは非常に難しいことがわかりました。必要なすべての情報を取得するには、14 回の結合と 7 回の GROUP_CONCAT() を行う必要があります。

そのため、データベースの設計に重大な欠陥があるに違いないと考えました。そして、それをより良く/より簡単にする方法について何かアイデアを求めたいと思いました.

4

1 に答える 1

0

データベースの正規化の主な目的は、冗長でデータ異常の影響を受けやすい方法でデータを保存しないようにすることです。

すべてのデータを取得するために複雑なクエリが必要になる場合がありますが、それはモデル化する情報の性質が複雑であるためです。それでも、データが混乱するのを避けるためには、正規化された設計の方が優れています。

多数の DISTINCT と GROUP_CONCAT を含むこのような複雑なクエリがある場合は、1 つのクエリで取得しようとしている情報が多すぎる可能性があることをお勧めします。2 つまたは 3 つのクエリを使用することが必ずしも有害であるとは限りません。コードの読み取り、保守、およびデバッグが容易になることで、多くのメリットが得られるでしょう。

この問題については、著書「SQL アンチパターン: データベース プログラミングの落とし穴の回避」の「スパゲッティ クエリ」という章で説明しました。

于 2012-11-29T19:27:46.620 に答える