2015-06-22 52 views
0

我看到add_index ~ unique: true声明schema.rb,认为唯一性约束对于,不为指数。采用指数的方式来实现独特的一个,程序员不应该指定的RDBMS“如何”和索引加快搜索,但削减成本插入。事实上,是否有另一种方法来保持唯一性约束?如果没有,为什么Rails只为我们提供唯一性约束的add_index声明?Can Rails可以处理没有索引的数据库唯一性吗?

+0

'add_index〜unique:true'它只是说在列上添加索引,索引对于该列应该是唯一的。因为我们不想要重复的索引条目。 –

+0

http://stackoverflow.com/questions/14622143/adding-unique-true-for-add-column-and-add-index-in-active-record –

+0

在模型中,你可以简单地尝试'validates:field_name,uniqueness:真正的http://guides.rubyonrails.org/active_record_validations.html#uniqueness –

回答

1

因为没有其他需要。在引擎盖下,它们都是一样的:当你定义一个UNIQUE约束时,会在该表上创建一个UNIQUE索引来强制执行它。从DBA.SE

  • 问:When should I use a unique constraint instead of a unique index?

    因此,对于支持这两种功能选择,其中使用往往会归结为喜欢的样式和一致性的数据库。

    所以在Rails中无处不在使用索引是一致的。这就是原因。

  • 甲从PostgreSQL's docs举:

    PostgreSQL自动当唯一约束或主键为表中定义的唯一索引。该索引涵盖组成主键或唯一约束的列(如果适用,则为多列索引),并且是实施约束的机制。

我没有找到权威人士的相关引用的MySQL,但是“谣言到处都是”。

+0

谢谢,我想知道添加唯一索引是否只有一个**约束唯一性的方法,事实根据您的回答是如此。然而,这个语法是针对在数据库中知道唯一性实现的用户,我认为它不好......(这可能是常识) – lastcat

+0

@lastcat假设“你可以约束表的列是唯一的”来自以前的经验与RDBMS,而不是常识。 Rails从那些知道它的人那里获得了这种可能性,然而,它却很清楚地记录了做它的最佳方式。 –

1

确保唯一性约束的唯一安全方法是在数据库级别执行该操作。它没有什么不对,事实上,这是真正的正确方法。任何数据库设计师或管理员都会向您确认。

Rails提供了唯一性验证程序,但它并不完全安全。事实上,它是基于对数据库的简单查询,但select和insert之间有一小段时间间隔,这使得它成为可能(并且很可能在高并发系统中,或者如果插入的数量合理的时间)有一个由于这种竞争条件而创建的重复记录。

因此,唯一保证唯一性的方法是在数据库上有一个唯一索引。如果您关心它,您可能需要阅读一些数据库设计书或资源,以不同的观点重新评估问题。

你仍然希望在你的模型中进行验证的原因是因为数据库(通常)不会以努力以用户友好的方式解决冲突。模型中的验证将预先验证数据并防止DBMS引发异常。您可以检查验证结果并向用户显示友好的信息。

尽管如此,数据库约束仍将存在,如果您的验证因前面提到的竞争条件而通过,您的数据完整性将由DBMS确保引发异常。

相关问题