Рассмотрим такую постановку задачи: есть два класса субъектов,
a и
b.
С каждым субъектом ассоциирован единственный пользователь, а с каждым пользователем - единственный субъект одного или другого класса.
Пользователи могут объединяться в группы (каждый пользователь принадлежит единственной группе), группы бывают соответственно двух типов,
a и
b.
Разумеется, если пользователь ассоциирован с субъектом класса
a или
b, то группа, в которую он входит, имеет также тип
a или
b соответственно.
Образец архитектуры базы, который может реализовать решение такой задачи:
CREATE TABLE `group`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,`name` TEXT,`type` ENUM('a','b')) ENGINE='InnoDB';
CREATE TABLE `user`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,`name` TEXT,`group` INT UNSIGNED NOT NULL,FOREIGN KEY(`group`) REFERENCES `group`(`id`)) ENGINE='InnoDB';
CREATE TABLE `a`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,`name` TEXT,`user` INT UNSIGNED NOT NULL,FOREIGN KEY(`user`) REFERENCES `user`(`id`)) ENGINE='InnoDB';
CREATE TABLE `b`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,`name` TEXT,`user` INT UNSIGNED NOT NULL,FOREIGN KEY(`user`) REFERENCES `user`(`id`)) ENGINE='InnoDB';
Теоретический вопрос: правильно ли я понимаю, что все отношения при такой структуре принадлежат четвёртой нормальной форме?
Практический вопрос (куда важнее): не содержит ли такая структура избыточности? Если содержит, то можно ли её как-то устранить? Желательно, по-человечески, без костылей.
Заранее спасибо.