Использование стандартного SQL ...
Обычный способ сделать «наследование» или «подклассы» - это составной ключ на (event_type, event_ID)
и использовать этот ключ в ссылочных таблицах «подтипа» сCHECK
ограничение для обеспечения того, что event_type
подходит для этого «подтипа», например, CHECK (event_type = 'Exercise start')
.
Дополнительным штрихом является то, чтобы event_type DEFAULT
в таблице 'subtype' снова соответствовал соответствующему типу, например 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 --
);
Однако существует большая проблема с MySQL, заключающаяся в том, что он не применяет ограничения CHECK
:( [То, как кто-либо может допустить эту ситуацию, мне не под силу!] Поэтому, чтобы ответить на ваш вопрос, имея простой ключ на event_ID
одного недостаточно, потому что вы не можете применить соответствующий тип в таблицах «подтипов».
Хотя может быть соблазн «продвинуть» event_ID
в качестве ключа-кандидата в таблице подтипов, этоможет не быть хорошей идеей. Хотя это позволило бы отображать в таблице только одну строку для данного event_ID
, если эта строка имеет неправильный тип, это предотвратит вставку строки с правильным типом!
Решение? Перейти к лучшей реализации SQL;)