2

ご入力いただきありがとうございます。

私は3つのオブジェクトを持っています:

  • 学校
  • キャンプ
  • コーチ

次の関係で:

  • 学校は複数のキャンプを持つことができます。
  • 学校は複数のコーチを持つことができます。
  • キャンプには複数の学校を含めることができます。
  • キャンプには複数のコーチを配置できます。
  • コーチは複数の学校を持つことができます。
  • コーチは複数のキャンプを持つことができます。

多対多のSchool_Campは、キャンプの年を識別するために、明らかに学校をキャンプにリンクし、日付のフィールドを追加します。ただし、1つのキャンプに複数のコーチを配置できます。

:: School_Camp ::

  • School_id
  • Camp_id
  • 日にち

School_CampテーブルとCoachテーブルにリンクするSchool_Camp_Coachという別の多対多を設定する方がよいでしょうか。

:: School_Camp_Coach ::

  • School_Camp_id
  • Coach_id

これがこれを行うためのより効率的な方法である場合...School_Campに、3つのフィールドを識別子として使用するのではなく、すぐに参照できる独立したID列を指定する必要がありますか?

:: School_Camp ::

  • id *
  • School_id
  • Camp_id
  • 日にち

また

3つの外部キーを持つ1つの多対多のテーブルSchool_Camp_Coachを使用する方がよいでしょうか。

:: School_Camp_Coach ::

  • School_id
  • Camp_id
  • Coach_id
  • 日にち

これに関して私が予測する唯一の問題は、外部キーのエントリが複数あるが、日付が異なることです。

再度、感謝します。

4

3 に答える 3

2

これは効率の問題ではなく、正確さの問題です。提示した2つのオプションは、テーブル内のレコード間の同じ関係をモデル化していないためです。

データベース内の各レコードは何かを意味します。ジャンクションテーブルのレコードの意味が「学校ZのキャンプYでコーチされたX」である場合は、オプション2を使用する必要があります。「学校ZのためにコーチされたX」および「学校ZがキャンプYを運営した」とは別に、「キャンプYでコーチされたX」の意味をモデル化する場合は、オプション1を使用する必要があります。

どちらの場合も、IDの3方向の組み合わせに依存するのではなく、ジャンクションレコードに独立した主キーを与える必要があります。ジャンクションテーブルに修正を適用するコードを実装すると、作業が簡素化されます。

于 2012-04-24T22:00:30.467 に答える
1

@TedHoppのコメントを参照してください。

データ(学校のキャンプは1分間に何度も発生しない)を考えると、更新時間は取得時間よりも優先度が低いと思います。それが本当なら、私はあなたの最後のオプションである3つの外部キーを選びます。

これはスタースキーマの例です。

于 2012-04-24T21:58:07.443 に答える
0

私にとってのエンティティは、多対多の関係で他のエンティティとリンクできるCoach、私が通常呼ぶものを持っているはずのエンティティのように見えます。basketこれが私の意味です:

# The coach model
CREATE TABLE coach(
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    name VARCHAR(20),
    capacity INT
) ENGINE=InnoDB;

# The coach data - who is using the coaches
CREATE TABLE coach_basket(
    coach_id INT,
    FOREIGN KEY(coach_id) REFERENCES coach(id),
    entity_id INT, /* the school or camp id */
    entity_type ENUM("School","Camp"),
    fromdate DATETIME,
    todate DATETIME
) ENGINE=InnoDB;

これで、すべてのコーチの使用状況を追跡でき、entity_id(学校またはキャンプID)と、コーチを使用するたびにそれらを使用した日時を入力するだけです。

どの学校とキャンプが接続されているかを保存するには、同様のタイプのテーブルが必要です。次のようになります。

# Store school-camp connections
CREATE TABLE connections(
    school_id INT,
    FOREIGN KEY(school_id) REFERENCES school(id),
    camp_id INT,
    FOREIGN KEY(camp_id) REFERENCES camp(id)
) ENGINE=InnoDB;

非常に単純で、学校とキャンプIDを保持するだけなので、school_idをクエリすると、学校が関連付けられている多くのキャンプを取得できます。その逆も同様です。

残っているのは、モデルであるあなたschoolcampテーブルだけです(上部のコーチテーブルのように)。

于 2012-04-24T22:15:37.560 に答える