2017-04-19 45 views
2

我有彼此相關的其他幾桌,它看起來是這樣的:最佳實踐更新大量卡桑德拉行可靠的(關係更新)

organizations: 
- id 
- name 
- ... other fields 

users: 
- id 
- name 
- organization_id 
- organization_name 
- ... other fields 

我一直organization_name字段中users表,以便它不必查找組織以獲取組織名稱

問題是,如果更改了組織名稱,則必須更新與組織相關的所有用戶以反映新名稱。在我的真實場景中,有更多的表格存儲organization_name

問題:目前我剛剛火起來的更新語句異步,如果中途失敗的話,我會用數據不一致

問題結束:有沒有最佳實踐如何應對這種問題?

可能的解決方案

  • 使用BATCH聲明。但是我發現它非常有限,因爲默認情況下它只允許50kb的查詢大小(在我的情況下,1次更新可能導致從兩個或三個不同的表中更新8,000個其他實體,並且字段值的長度不同) - 因此查詢大小相當難以預測)
    • 我實際上嘗試使用BATCH語句來更新100個項目(在需要更新的600個項目中),並且由於「批量過大」異常而失敗......
  • 重試失敗的更新

PS - 我行不是太寬,最多我每桌約20列


更新:

忘了添加,這是一個web應用程序,需要儘快反映更新,所以批量作業將不適用


更新2:

關於閱讀模式,我現在的例子過於簡單,但在任何情況下,我需要獲取用戶列表(也可以是由多個組織) - 這可能成千上萬的用戶的回報超過了數百個組織這就是爲什麼我保存organization_nameusers表作爲我的理解是,與卡桑德拉數據的非規範化是去

+0

你的閱讀模式是什麼?爲什麼你想避免查找用戶的組織名稱?如果要顯示有關一個用戶的信息,最好有一個附加請求來獲取組織名稱,而不是許多表之間的支持一致性。 –

+0

@MikhailBaksheev我更新了問題以包含更多細節。我同意如果顯示給一個用戶,那麼存儲組織名稱是沒有意義的:-) – GantengX

+0

您要通過哪些字段獲取用戶?或所有用戶? –

回答

3

就像每個長時間運行的更新過程的方式,您應該使用書籤的概念:

  • 運行工作(如100),異步更新,然後儲存的地方,你只是做了更新100行。
  • 運行另一個100行的另一份工作,然後書籤您剛剛更新了200行。
  • 等等...

在發生碰撞的情況下,你只會繼續在那裏你墜毀通過閱讀你的書籤。

要執行此類任務,您必須已經知道您必須更新哪些記錄,但我假設您已經知道它們或知道如何檢索該信息。

2

嘗試使用分頁。大多數司機都支持它。

1)從用戶表中接收更新結果,並在每個頁面中分頁x行。

2)爲頁面中的每個記錄運行異步更新。

3)轉到下一頁。