在列上强制执行唯一性但允许一些重复的最佳实践?

tor*_*tte 2 sql postgresql database-design unique-index

以下是我想要弄清楚的:应该有一个表来存储我们的新客户端管理系统的授权,并且每个授权都有其唯一标识符.这种约束很容易转换为SQL,但不幸的是,由于官僚机构的缓慢,有时我们需要创建一个带占位符ID的条目(例如"temp"),以便客户端能够开始接受服务.

强制执行此条件唯一性约束的最佳做法是什么?

这些是我可以想出的有限经验:

  • 使用Postgresql手册中提到的部分索引(5.3.3. - > 例11-3.).它还提到了这一点This is a particularly efficient approach when there are few successful tests and many unsuccessful ones.在我们要迁移的旧数据库中,每月有130,000行和大约5个临时授权,但整个表每年仅增长约200行.这是正确的方法吗?(我也不确定在这种情况下"有效"意味着什么.)
  • 为临时授权创建一个单独的表,但它会复制表结构.
  • 为一组列定义唯一约束.授权是针对发给个人的特定时间段的特定服务.

编辑:

对不起,我认为我对授权ID的描述有点模糊:它由国家部门提供,格式为NMED012345678,并且是手工输入的.它是独一无二的,但有时仅在以后提供,原因不明.

Erw*_*ter 5

有一种简单,快速和安全的方式:

添加一个布尔列来标记临时条目,默认情况下为NULL,例如:

temp bool DEFAULT NULL CHECK (temp)
Run Code Online (Sandbox Code Playgroud)

添加的检查约束FALSE仅允许NULLTRUE不可能.默认NULL值的存储成本通常是......没有 - 除非行中没有其他NULL值.

列默认值意味着您通常不必处理该列.它默认 NULL(无论如何,这是默认的默认值,我只是在这里明确).您只需要明确标记少数例外.

然后创建一个部分唯一索引,如:

CREATE UNIQUE INDEX tbl_unique_id_uni ON tbl (unique_id) WHERE temp IS NULL;
Run Code Online (Sandbox Code Playgroud)

这只包括应该是唯一的行.索引大小根本没有增加.确保将谓词添加WHERE temp IS NULL到应该使用唯一索引的查询中.

有关: