Задать вопрос
@immelnikoff
Изучаю БД

В чём моя ошибка проектирования схемы БД?

Имеется предварительная схема БД (участок схемы):
5db812d8e36bb687997793.png
Краткое описание предметной области:
Имеется таблица Schedule, в которой энергетиками (юзерами) в разных городах устанавливается расписание включения и отключения уличного освещения (через web-морду, разумеется).
Юзеры могут создавать расписание как для города целиком, так и для групп линий освещения и даже для отдельных линий. Поэтому таблица Schedule ссылается по FK на "область видимости" для установленного расписания. Расписание, установленное для линии, приоритетнее расписания, установленного для группы, которой эта линия принадлежит (линия в конкретный момент времени может принадлежать только одной группе).
В таком же отношении находятся группы и города.
Мне не нравится табличка SkopeForSchedule. Не нравится тем, что одну "область видимости" для расписания можно несколькими способами. Например, записи (line_id = 1, group_id = 1, city_id = 1), (line_id = 1, group_id = 2, city_id = 1) и (line_id = 1, group_id = 10, city_id = 111) представляют одну "область видимости" – line_id = 1. Напоминаю, что значение в line_id приоритетнее значения в group_id, а значение в group_id приоритетнее значения в city_id.
Второе, что мне не нравится в этой схеме. Юзеры могут создавать и удалять города, группы и линии. При этом, когда юзер удаляет, например, группу, то соответствующая запись в таблице Group не удаляется, а помечается временем удаления в поле deleted. Может получится, что сначала какая-то линия принадлежала одной группе, а затем стала принадлежать другой группе. То есть в историческом контексте таблицы Group и Line связаны как M:N. Аналогично связаны таблицы City и Group. Поэтому для этих двух связей нужно добавить таблички M:N.
Насколько вообще такая схема хороша и что в итоге нужно сделать с таблицей ScopeForSchedule?
  • Вопрос задан
  • 254 просмотра
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 3
inoise
@inoise
Solution Architect, AWS Certified, Serverless
Плоха схема. Работать будет, но не позрачно.

Проблемная таблица пробует решить бизнес-логику. Решение - сделать три таблицы связей many-to-many, а агрегацию вынести в приложение
Ответ написан
Комментировать
tsklab
@tsklab
Здесь отвечаю на вопросы.
С учётом вопросов про журнал изменений, предлагаю схему:
Город: код, название.
Группа: код, код города, название.
Линия, код, код группы, название.
Расписание: код, код линии, дата и пр.
Архив расписаний: название города, название группы, название линии, имя пользователя, время действия, действие (создал, изменил, удалил) (город, группа, линия, расписание), данные из расписания. К названиям можно добавить соответствующий код для справки, без внешнего ключа.
Ответ написан
Комментировать
AndyKorg
@AndyKorg
Кнопконажиматель и припоерасплавлятель
Можно поступить так:
5db9863cbaaa6548213757.jpeg
Ответ написан
Ваш ответ на вопрос

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

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