在Symfony中Postgres部分唯一索引

时间:2013-12-19 01:33:05

标签: php postgresql symfony doctrine-orm

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){

2 个答案:

答案 0 :(得分:5)

Postgres 9.0+中有一个非常简洁的构造称为排除约束。在CREATE TABLE的文档中对其进行了简要说明。因为在这个例子中我们只依赖于排除约束的谓词部分而不是运算符的灵活性,所以我会使用B树索引,尽管有文档推荐。如果您搜索' postgres索引类型',您可以阅读一些有关不同索引类型的内容。目前我无法在答案中发布多个链接,因为我是新来的,因此您只需要谷歌即可。 :)

fiddle是其工作原理的一个示例。基本上,EXCLUDE末尾的谓词会将约束转换为UNIQUE,只会应用WHERE "default" = true

如果可能有其他应用程序与表进行交互,这可能是最好的路径,但如果信息可用并且在前端应用了约束,则可能更快地向客户提供反馈。

答案 1 :(得分:1)

我认为学说现在确实支持了!看看吧 doctrine annotation reference,特别是@index部分。

<?php
/**
 * @Entity
 * @Table(name="ecommerce_products",indexes={@Index(name="search_idx", columns={"name", "email"}, options={"where": "(((id IS NOT NULL) AND (name IS NULL)) AND (email IS NULL))"})})
 */
class ECommerceProduct
{
}
相关问题