...
制約を持つ参照 'サブタイプ'テーブルのこのキーは、event_type
がその 'サブタイプ'に適切であることを保証します。 CHECK (event_type = 'Exercise start')
。
「サブタイプ」テーブルのevent_type DEFAULT
をもう一度適切なタイプに一致させることです。 event_type VARCHAR(20) DEFAULT 'Exercise start' NOT NULL
。
構造は次のようになります。
CREATE TABLE EventTypes
(
event_type VARCHAR(20) NOT NULL PRIMARY KEY
);
CREATE TABLE Events
(
event_ID CHAR(10) NOT NULL,
event_type VARCHAR(20) NOT NULL
REFERENCES EventTypes (event_type),
event_date DATE NOT NULL,
PRIMARY KEY (event_type, event_ID)
);
CREATE TABLE ExerciseStartEvents
(
event_ID CHAR(10) NOT NULL,
event_type VARCHAR(20) DEFAULT 'Exercise start' NOT NULL
CHECK (event_type = 'Exercise start'),
FOREIGN KEY (event_type, event_ID)
REFERENCES Events (event_type, event_ID),
PRIMARY KEY (event_type, event_ID),
exercise_description VARCHAR(30) -- etc --
);
しかし、それはCHECK
制約を強制しないことにMySQLで大きな問題がある:([誰もがこのような状況に耐えることができますどのように私を超えている!]だから、あなたの質問に答えるには、event_ID
だけのキーを持っているだけでは適切ではありません。
event_ID
が候補キーになるように誘惑しているかもしれませんサブタイプテーブルでは、これは良い考えではないかもしれません。 ouldは与えられたevent_ID
がテーブルに現れるように1つの行だけを許可します。もしその行のタイプが間違っていれば、正しいタイプの行が挿入されないでしょう!
解決策?より良いSQLインプリメンテーションに移動する)
テーブルの構造に関するいくつかの特質を使用すると役立ちます。違うノートでは、サロゲートキー(EventIdが自動インクリメント値であると仮定しています)を使用するたびに、PK以外のカラムで構成されるテーブルに対して別のユニーク制約を定義する必要があります。たとえば、イベントテーブルで、イベントを一意に識別するその他の情報:DateTime、UserId、TypeCodeを組み合わせたもの – Thomas
User/DateTime/Typecodeは理論的には一意でなければなりません。私はまだすべてのための合成キーを持っていないことに慣れていません、それは私が学校でどのように教えられ、何年もしてきたことです。ここに特定のデータベースに関する詳細情報があります:http://stackoverflow.com/questions/4801628/one-table-or-many-for-many-different-but-interacting-events – Damon
@Damon、悲しいことに、管理コースは、データベース設計において鍵の賢明な使用を教えることに全く失敗している。私は、代理キーだけを検討する価値があることを学んだように見えるあなたのような人たちを見つけました。成功した結果を得るためには、自然キーがはるかに重要である現実の世界では、これは実用的ではありません。 – sqlvogel