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