Я проектирую базу данных для конкурса.У меня есть несколько таблиц, подобных этим
competition(cid (PK), competition_name),
participant(pid (PK), participant_name),
category(catid (PK), category_name, cid (FK) ), WHERE cid REFERENCES competition(cid)
. Теперь участник будет участвовать в соревновании, и ему будет присвоен значок для доступа к объекту соревнования, и этот значок будет считаться идентификатором участника.Заявлено примерно так:
part_comp(
badge (PK),
pid,
cid,
UNIQUE(pid, cid),
UNIQUE (badge, cid)
)
Участники могут соревноваться в 1 или более категориях.Эти отношения могут быть представлены в таблице
part_category(
badge,
catid,
PRIMARY KEY (badge, catid) -- a participant can participate a category ONCE
FOREIGN KEY (badge) REFERENCES part_comp(badge),
FOREIGN KEY (catid) REFERENCES category(catid),
)
. Этот дизайн соответствует 3NF, но трудно установить значение catid
, чтобы убедиться, что оно относится к конкуренции, связанной со значением badge
.
У меня вопрос : если я добавлю избыточный столбец, пусть говорит "cid" в таблицу part_category, чтобы упростить принудительную интеграцию в поле catid, например:
part_category(
badge PK,
cid, <-- this is redundant column
catid,
-- to make sure this category belong to the participated competition
FOREIGN KEY (cid, catid) REFERENCES category(cid, catid),
-- to make sure the badge is the one associated with the competition cid
FOREIGN KEY (badge, cid) REFERENCES part_comp(badge, cid)
)
Или оставьте таблицу part_category для соответствия 3NF, затем используйте либо логику в приложении, либо напишите сложный триггер, чтобы убедиться, что столбец catid
принадлежит соревнованию, которое ассоциируется с badge
?
.Проблема усложняется, когда соревнования имеют подкатегории, и участникам разрешено соревноваться в некоторых подкатегориях, а не во всей 1 категории.Куда мне идти?