2

我有一个关于唯一性验证的问题。

来自: http: //guides.rubyonrails.org/active_record_validations_callbacks.html#uniqueness

“它不会在数据库中创建唯一性约束,因此可能会发生两个不同的数据库连接为您打算唯一的列创建具有相同值的两条记录。为避免这种情况,您必须在您的数据库。”

这是否意味着每当我验证唯一性时,我都必须在数据库中添加一个索引?还是只有在可能同时插入两个记录时才需要这样做?

这里的最佳实践是什么:唯一性和索引总是在一起或取决于情况?

4

1 回答 1

3

它本质上是一个竞争条件。Alice 使用电子邮件地址 alice@gmail.com 注册并点击提交按钮两次。因为她击中它们的速度如此之快,所以她只记得它们,并且它们通过了验证。然后将两者都写入数据库。对此的解决方案是要求数据库在它们存储在内存中或写入数据库之间检查唯一性。

您需要做的是在迁移中添加这样的一行:

add_index :table_name, :column_name, unique: true

就最佳实践而言,当有两个相同会导致问题时,您肯定想这样做。如果两条推文提交的内容相同,这可能不是什么大问题,但如果您有两个用户使用相同的电子邮件地址,那就会成为问题。

于 2012-09-14T15:01:51.550 回答