Database 表中的唯一组合

Database 表中的唯一组合,database,django,postgresql,Database,Django,Postgresql,我有两张桌子:House和Picture。图片表格有一列主页,这是一个bool,还有一个房屋id。这意味着房屋有图片,只有标记为主页的图片才会出现在主页中 问题:每家每户应该只有一张主页图片。或者:可以有多个(house\u id,homepage):(1,False),但只有一个(house\u id,homepage):(1,True)元组。我怎样才能使它在PostgreSQL中工作 这样的情况有名字吗?当然,这不是主键,因为可以有许多(1,False)元组 数据库上的解决方案很有帮助奖励点

我有两张桌子:
House
Picture
图片
表格有一列
主页
,这是一个
bool
,还有一个
房屋id
。这意味着房屋有图片,只有标记为
主页
的图片才会出现在主页中

问题:每家每户应该只有一张主页图片。或者:可以有多个
(house\u id,homepage):(1,False)
,但只有一个
(house\u id,homepage):(1,True)
元组。我怎样才能使它在PostgreSQL中工作

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

数据库上的解决方案很有帮助奖励点:关于如何在Django模型层上实现这一点的解决方案将非常好

如果您希望始终保证数据完整性,可以(而且应该)在数据库级别解决此问题。有多种方法,a可能是最简单、最有效的方法

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

还将加快检索主页图片的查询速度,作为附带好处

更改模式 另一种方法是在表
house
中添加一列
主页id
,指向所选图片。自动地,只能选择一张图片。你不再需要
picture.homepage
。引用完整性可能有点棘手,因为在两个方向上都有外键约束,但我有类似的工作解决方案。

如果您希望始终保证数据完整性,可以(而且应该)在DB级别解决它。有多种方法,a可能是最简单、最有效的方法

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

还将加快检索主页图片的查询速度,作为附带好处

更改模式 另一种方法是在表
house
中添加一列
主页id
,指向所选图片。自动地,只能选择一张图片。你不再需要
picture.homepage
。由于两个方向上的外键约束,引用完整性可能有点棘手,但我有类似的工作解决方案