Уникальная комбинация в столе

У меня есть две таблицы: 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;

-> sqlfiddle

Также ускорит запросы для получения фотографий на главной странице в качестве сопутствующей выгоды.

Изменить схему

Другой подход заключается в добавлении столбца homepage_id к столу house, указывая на выбранную картинку. Автоматически можно выбрать только 1 изображение. Вам не нужно picture.homepage больше Ссылочная целостность может быть немного хитрой из-за ограничений внешнего ключа в обоих направлениях, но у меня есть такие рабочие решения.

Другие вопросы по тегам