3

私は、市民と労働者の2つのカテゴリーの人が行うことができるさまざまな種類のイベントに関する情報を含む表を持っています

だからそれぞれのために私はそれぞれのテーブルを持っています

civil{  civil_id, name, age,telephone...} the  primary key is civil_id

worker{ worker_id, name, duty, department...} the  primary key is worker_id

次に、イベントテーブルにすべての可能なイベントのリストがあります

event {type_of_event} the  primary key is type_of_event

その後、他のテーブルに情報を保存する予定です

偶数タイプで、仕事をした人(労働者または市民)

id  event_type       date      person
-----------------------------------
1   type1         12-12-12     x 
2   type1         05-12-10     y
3   type2         02-12-12     y

この設計では、誰がその仕事をしたかを関連付ける方法がわかりません。ある種の人(別名civil)しかいない場合、この最後のテーブルのpersonフィールドにcivil_idのみを格納します。それが市民か労働者かを知っていますが、他の中間テーブルが必要ですか?

4

2 に答える 2

8

一般的に、このタイプの状況をモデル化する方法があります...

排他的外部キーの使用

ここに画像の説明を入力してください

では、とeventの両方がNULL可能ですが、常に一方がNULLでないことを保証する制約もあります。civil_idworker_id

CHECK (
    (civil_id IS NOT NULL AND worker_id IS NULL)
    OR (civil_id IS NULL AND worker_id IS NOT NULL)
)

継承の使用1

ここに画像の説明を入力してください

継承の詳細については、ERwinメソッドガイドの「サブタイプの関係」の章とこの投稿を参照してください。


1別名。カテゴリ、サブタイピング、サブクラス化、一般化階層..

于 2013-02-28T12:15:25.017 に答える
1

foreign keyこの缶では、複数の親がいるため、を設定できません。高速検索を実行するため、またはテーブルのfull table scan列にインデックスを定義しないようにするため、およびを使用してpersonテーブルeventを結合しますLEFT JOIN。例えば、

SELECT  ....,
        COALESCE(b.name, c.name) AS personname
FROM    event a
        LEFT JOIN civil b
            ON a.person = b.civil_id
        LEFT JOIN worker c
            ON a.person = c.worker_ID

追加するINDEX

ALTER TABLE event ADD INDEX (person)
于 2013-02-28T05:41:13.640 に答える