2016-03-24 10 views
0

私は次の回答を検索しましたが、主にサロゲートを使用するかどうかに関係なく、子供の複合キーを使用するかどうかではなく、テーブルを結合する。データベース設計 - ジョインテーブルの子キー選択

私はテーブルattendeesとテーブルeventsを持っています。

結合テーブルは、2つの外部キーattendee_idevent_idを含む、event_attendeesであり、また、代理の主キーid

は、今度はイベントで参加者がschedule_itemsを持つことができるとしましょうました。

通常、テーブルevent_attendee_schedule_itemsには、event_attendee_id,schedule_item_idという列を使用します。

もしあれば、以下の複合外来キーを使用すると、上記のような欠点がありますか?

attendee_idevent_idschedule_item_idevent_attendeesテーブルへの直接リンクの代わりに複合キー)?

+1

coumpoundキーを使用した2番目の解決方法は、私にとってはより論理的です。一度に1つの場所に1人いるので... 3つのテーブルを一緒にリンクしています... –

答えて

1

場合、私は最初のアプローチをお勧めします:テーブルevent_attendeesがまだ必要とさ

  • 。 2つのジョインテーブルevent_attendeesevent_attendee_schedule_items(これは基本的に2番目の方法を使用する場合に得られるものです)があると、一貫性のないデータを入力する可能性があります。 2つのテーブルが同期していることを保証することができたとしても(例えば、データを書き込んでいる外部プログラムによって)、私はこれには関係ありません。

  • はあなたになりますentry_badge_idのような独自のプロパティを持っていevent_attendees

  • event_attendeesに共通のデータを置くことができます(データを請求するためにリンクする)テーブルevent_attendee_invoice_partsのように、同じスタイルで他の拡張機能のアイデアを持っていますevent_attendee_schedule_itemsの文脈で使用される。このクエリでは、とにかくevent_attendeesに参加する必要があります。

最後の理由は、私たちに、追加のヒントを提供します:それはテーブルとあなたが作るクエリでデータの量に依存します!場合によっては、コンポジットキー(コンポジットインデックス)のパフォーマンスが向上する場合もあれば、そうでない場合もあります。詳細な説明は、this questionを参照してください。

+0

これは私がやったことです。私はあなたが以前に書いたようなパターンを使い、それはうまくいきました。 大きな違いは、私が考えていなかった点は、event_attendeesテーブルに共通のデータを格納するという考えでした。 返信いただきありがとうございます。 – Squadrons

関連する問題