@immelnikoff
Изучаю БД

Как наложить нетривиальное ограничение уникальности на поле?

Имеется кусок схемы БД:
5db9923132192439590073.png
Каким образом можно в таблице tp реализовать ограничение уникальности поля addr в рамках города (а не только района, как показано на схеме)?
Дальнейшей разумной нормализации данная схема не подлежит, но при этом ограничение уникальности поля addr не надуманно, а вытекает из модели данных.
Используемая СУБД: MySQL 8.0.
  • Вопрос задан
  • 122 просмотра
Решения вопроса 2
@orbit070
Ограничение уникальности накладывается на поля в рамках одного отношения, то есть то что вам хочется провернуть, а именно заглянуть как-то в другую табу чтобы проверить уникальность, из коробки такой возможности нет. Два наиболее очевидных способа решения задачи:
1) Прокинуть city_id в нужную таблицу. Да, не по феньшую, но реальность такая что нормализованные базы данных существуют только в книгах по базам данных или во всяких простячковых проектах, добро пожаловать.
2) Оставить все по феньшую и просто повесить триггер, в котором и будет происходить проверка уникальности по городу.
Ответ написан
@Vitsliputsli
Создавать связь по city_id плохой вариант. Да, вы решите вопрос с уникальностью, но потеряете принадлежность районов к определенному городу в рамках таблицы ТР.
Поэтому решайте с помощью внешнего языка программирования или хранимых процедур. Триггеры не очень явная штука, я бы лучше создал отдельную процедуру для заведения новых ТР, если выберите 2 вариант.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@beerchaser
На мой взгляд в данном случае будет разумно сделать денормализацию - первый вариант, предложенный orbit070. Это позволит, во-первых, снизить вероятность указания неверного города (значения город/район для вставки устанавливаются вместе), во-вторых, в дальнейшем упростит запросы по таблице ТП.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
12 июл. 2020, в 07:00
1000 руб./за проект
12 июл. 2020, в 06:59
3000 руб./за проект
12 июл. 2020, в 02:02
3000 руб./за проект