0

私はこれを正しく行っているかどうかわからない奇妙なデータベース設計の問題を抱えています。私の現在の設計は非常に複雑なので、次の図では、家と居住者(実際のエンティティではない)を使用して比較して簡略化しています。

したがって、データベース設計のどの部分がどのように見えるかを次に示します。

標準状態:

  • 複数の家
  • 家ごとに複数のフロア
  • フロアごとに複数のベッドルーム

それほど標準的ではない条件:

  • 各居住者は複数の家に住むことができます
  • 各居住者は、家ごとに複数の寝室を持つことができます
  • 各居住者は、1つの家につき1つのフロアに1つのベッドルームしか持てません(これは注意が必要な部分です)。たとえば、1階に1つのベッドルーム、2階に1つのベッドルーム、3階に1つのベッドルームを持てますが、同じ場所に2つのベッドルームを持てることはできません。床

したがって、私が達成しようとしているのはこれです。アプリのデザインでは、私は知っていますhouse、私は知っています、floorそして私は知っていoccupantます。ユーザーが指定せずにこの情報で知る必要があるbedroomoccupantは、これら3つの基準に基づいたものです。2つの解決策があります。1つ目は、occupants_has_bedroomsテーブルで主キーを、、occupants_idおよびbedrooms_floors_idにすることbedrooms_floors_houses_idです。ただし、bedrooms_id主キーを削除すると、テーブルは親との識別関係ではなくなります(bedrooms)。親なしでは存在できなかったので、それは識別関係です。したがって、4つのIDすべてを主キーとして保持する必要があるとのことです。私の2番目のオプションは、これら3つの値の間の一意のインデックスですが、これは、私がこれに間違ってアプローチしている可能性があると考えたときです。

どうすればこれを達成できますか?

4

2 に答える 2

1

これは、MySQLに固有ではないが、それでも役立つはずの一般的なデータベース設計戦略です。

データをクエリする方法を知っているのは良いことですが、それがモデルに過度に影響を与えないようにしてください(少なくとも最初は)。

最初に明確にする必要があるのは、各テーブルのPKは何ですか?floorsとの複合キーを使用しているようですbedrooms。交差テーブルを除くすべてのテーブルに情報のないキー(テーブルごとのID列)戦略を使用した場合Occupants_has_bedrooms、結合が簡単になります。私はあなたができると仮定するつもりです、それでここにそこから行く方法があります:

私が最初に変更するのは、寝室のfloors_house_id列を削除することです。これは冗長になり、結合から取得できます。

次に、次の変更を加えますoccupants_has_bedrooms

  1. のPKは、occupants_idとbedroom_idの2つの列のみである必要があります。(なぜですか?主キーには、行を一意に識別するのに十分な情報のみが含まれている必要があるためです)。
  2. bedrooms_floors_houses_idによって決定されbedrooms_floors_id、不要であるため 、を削除します。
  3. occupants_id( 、 )に一意性制約を追加bedrooms_floors_idして、「それほど標準的ではない」条件を適用します。

最後に、を除くすべてのテーブルで内部結合を実行Occupantsし、WHERE句に3つの条件を追加します。これにより、希望する結果が得られるはずです。コンポジットキーが本当に必要な場合でも、面倒になります。申し訳ありませんが、私は編集者の近くにいないか、あなたのためにそれを図解します。

于 2012-09-01T06:43:28.633 に答える
0

私はあなたがしたこととは逆にデータベースを設計するでしょう。

House
  id
  name
  Floors -- Many to many

Floor
  id
  name
  Bedrooms -- Many to many
  optional: you can have a back pointer to house

Bedroom:
  id
  name
  Occupants -- many to many
  optional : back pointer to floor

Occupant:
  id
  name
  optional : back pointer to Bedroom

これで多対多のテーブルができたので、条件をかなり簡単に照会できます。

于 2012-09-01T05:53:15.417 に答える