2015-06-22 46 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確保引發異常。

相關問題