Уникальная комбинация в столе
У меня есть две таблицы: House
а также Picture
, Picture
таблица имеет столбец homepage
, который является bool
и house_id
, Это означает, что дома имеют изображения, и только изображения помечены как homepage
появится на главной странице.
Проблема: в каждом доме должна быть только одна фотография домашней страницы. Или: может быть столько (house_id, homepage):(1, False)
но только один (house_id, homepage):(1, True)
кортежи. Как я могу заставить это работать для PostgreSQL?
Есть ли название для такой ситуации? Это не первичный ключ, конечно, так как может быть много (1, False)
кортежи.
Решение по базе данных помогает. Бонусы: решение о том, как реализовать это на Django, на уровне модели, было бы здорово!
1 ответ
Это может (и должно) быть решено на уровне БД, если вы хотите гарантировать целостность данных в любое время. Существуют различные способы, частичный UNIQUE INDEX
вероятно, самый простой и эффективный.
CREATE UNIQUE INDEX picture_homepage_uni ON picture (house_id) WHERE homepage;
Также ускорит запросы для получения фотографий на главной странице в качестве сопутствующей выгоды.
Изменить схему
Другой подход заключается в добавлении столбца homepage_id
к столу house
, указывая на выбранную картинку. Автоматически можно выбрать только 1 изображение. Вам не нужно picture.homepage
больше Ссылочная целостность может быть немного хитрой из-за ограничений внешнего ключа в обоих направлениях, но у меня есть такие рабочие решения.