Задать вопрос

Денормальна ли архитектура? Избыточна ли?

Рассмотрим такую постановку задачи: есть два класса субъектов, 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';


Теоретический вопрос: правильно ли я понимаю, что все отношения при такой структуре принадлежат четвёртой нормальной форме?
Практический вопрос (куда важнее): не содержит ли такая структура избыточности? Если содержит, то можно ли её как-то устранить? Желательно, по-человечески, без костылей.
Заранее спасибо.
  • Вопрос задан
  • 2434 просмотра
Подписаться 4 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 1
@robofox
Сама по себе избыточность ни на что не влияет (кроме затрат на хранение данных), и иногда бывает полезна. Нужно оценивать структуру с точки зрения здравого смысла и эффективности.

Например, зачем делать 2 таблицы (a и b), если у них одинаковый набор полей? Можно сделать одну таблицу с полем ENUM('a','b').

Если объекты будут добавляться (например "c"), то целесообразней сделать отдельную таблицу связей "пользователь-объект". Если при этом объекты "a", "b" и "c" будут в одной таблице, количество костылей заметно сократится, производительность увеличится (если будут индексы).

Еще: поле `group` у пользователя NOT NULL. А если пользователь не будет состоять ни в одной группе?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы