Postgres可以做部分独特的索引,但我找不到任何教条文档,表明对此有任何支持.
http://www.postgresql.org/docs/current/interactive/indexes-partial.html#INDEXES-PARTIAL-EX3
我如何在Symfony中拥有一个实体,例如电子邮件.我想在哪里存储默认电子邮件的布尔标志.
电子邮件表看起来像,
id,user_id,email,default 1,1,email@something.com,false 2,1,email2@something.com,true 3,1,email3@something.com,false
我想在user_id上使用唯一约束,默认= true.
SQL我会做类似的事情,
CREATE UNIQUE INDEX default_constraint ON emails (user_id) WHERE default;
还有另一种方法吗?我在实体中考虑了prePersist函数,但这需要db调用来检查.
编辑:我也在考虑一个事件监听器, http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html
我不确定我是否想听每个prePersist事件,我可以听一个特定的实体而不必过滤if语句.例如if($ entity instanceof Product){
Postgres 9.0+中有一个非常简洁的构造称为排除约束.在CREATE TABLE
文档中对其进行了简要说明.因为在这个例子中我们只依赖于排除约束的谓词部分而不是操作符的灵活性,所以我会使用B树索引,尽管有文档的建议.如果搜索"postgres索引类型",您可以阅读一些有关不同索引类型的信息.目前我不能在答案中发布多个链接,因为我是新来的,所以你只需要google它.:)
这个小提琴就是它如何运作的一个例子.基本上,在结束时的谓词EXCLUDE
将约束转换UNIQUE
为仅应用的约束WHERE "default" = true
.
如果可能有其他应用程序与表进行交互,这可能是最佳路径,但如果信息可用且前端应用了约束,则可能更快地向客户端提供反馈.