Следует добавить избыточный столбец или должен следовать 3NF?Как спроектировать отношения как с родительской, так и с дочерней таблицами и при этом обеспечить целостность? - PullRequest
0 голосов
/ 24 сентября 2019

Я проектирую базу данных для конкурса.У меня есть несколько таблиц, подобных этим

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 категории.Куда мне идти?

...