簡體   English   中英

表之間具有唯一約束

[英]Have unique constraint between tables

我需要驗證一個元素的唯一性,但是每個元素可以具有n代碼,並且需要對此進行驗證。 元素應在類型,提供者,時間和代碼方面唯一。 創建元素時,如果其中任何代碼與現有元素代碼重疊,則表示該元素具有代碼數組,這意味着該元素相同。

例如有

代碼

| id     | code|
|:-------| ---:| 
| 1      | 123 | 
| 2      | 456 |

分子

| id     | type          | provider_id  | time       |
|:-------|:-------------:| ------------:|-----------:|
| 1      | A             | 1            | 01/01/2016 |

codes_elements

| code_id | element_id  |
|:--------|------------:| 
| 1       | 1           | 

期望:

當我嘗試插入時:

`Element = type: A, provider: 1, codes: [1], time: 01/01/2015`

我希望這會失敗,因為違反了禁忌素

當我嘗試插入時:

`Element = type: B, provider: 1, codes: [1], time: 01/01/2015`

我希望這會創建一個具有代碼關系的新元素

當我嘗試插入時:

`Element = type: A, provider: 1, codes: [2], time: 01/01/2015`

我希望這會創建一個新元素,因為元素相同,但代碼數組不會與任何其他元素重疊

當我嘗試插入時:

`Element = type: A, provider: 1, codes: [1, 2], time: 01/01/2015`

我希望此添加關系僅在code_elements中,因此元素1現在將具有2個代碼,因為代碼1與其他元素重疊,這意味着這是相同的元素,因此我只需要包含代碼2

我看到的選項

  • 將聯接表更改為元素表中的int數組。-在這種情況下,我可以按其他列進行搜索並附加代碼ID,還可以按代碼數組創建condin,以防止重復。 問題是當我通過代碼查詢元素表很慢時,例如用代碼1獲取所有元素。

  • 創建觸發器,並檢查代碼是否與其他元素重疊,如果不創建新元素,則僅分配代碼關系。

我正在使用Ruby on Rails,但是我需要模型驗證是不夠的,因為我有多個線程同時執行插入操作,並且可能以重復操作結束

我想了解有關當前想法的更好選擇或評論,以期改善性能,防止重復等。

為什么不在RoR中設置驗證?

如果重復該元素,則無論如何都會出現錯誤消息。 如果重復,您可以在RoR中處理錯誤並在元素的末尾添加“ 1”之類的字符。 另一個選項是在codes_elements表中創建“合並”列,然后將element + code值保存在其中。

編輯:

您可以確定不使用事務保存重復的行:

ActiveRecord::Base.transaction do
   elements.code do |c|
     Element.find_or_create_by(code: c, element: e)
    or
     Element.exists? code: c, element: e
   end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM