database - 表中的独特组合

标签 database django postgresql

我有两个表:HousePicturePicture 表有一列 homepage,它是一个 bool 和一个 house_id。这意味着房屋有图片,只有标记为 homepage 的图片才会出现在主页中。

问题:每个房子应该只有一张主页图片。或者:可以有许多 (house_id, homepage):(1, False) 但只有一个 (house_id, homepage):(1, True) 元组。我怎样才能使它适用于 PostgreSQL?

有这样的情况的名称吗?这当然不是主键,因为可以有很多 (1, False) 元组。

数据库上的解决方案有帮助。 加分项:关于如何在模型层的 Django 上实现它的解决方案会很棒!

最佳答案

如果您想始终保证数据完整性,可以(也应该)在数据库级别解决。有多种方式,一个partial UNIQUE INDEX可能是最简单和最有效的。

CREATE UNIQUE INDEX picture_homepage_uni ON picture (house_id) WHERE homepage;

->sqlfiddle

作为附带利益,还将加快查询以检索主页图片。

更改模式

另一种方法是向表 house 添加一列 homepage_id,指向所选图片。自动只能选择 1 张图片。您将不再需要 picture.homepage。由于双向的外键约束,参照完整性可能有点棘手,但我有这样的工作解决方案。

关于database - 表中的独特组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15040695/

相关文章:

postgresql - PostgreSQL 的解释究竟告诉我什么?

ruby-on-rails - rake 数据库 :create:all FATAL : password authentication failed

Django tastypie和GenericForeignKey

php - 在 php 中获取 pgsql 结果集的详细字段信息

python - Django : cannot unpack non-iterable int object

python - Django 模型限制基于另一个模型但具有特定字段值的选择

python - django 或 postgresql 的缓存问题

c# - 参数 '@id' ,向数据库插入数据时未提供该参数

sql - 逻辑模式和物理模式有什么区别?

java - 从用户查找数据库中的数据