2011-06-29 34 views
0

我正在使用Ruby on Rails 3.0.7和MySQL 5.在我的應用程序中,我有兩個數據庫表,比如TABLE1和TABLE2,並且出於性能方面的原因,我已經對TABLE2中的一些數據進行了歸一化處理, TABLE1的值。現在,在TABLE1中,我需要更新一些涉及的值,當然,我還必須正確更新TABLE2中的非規格化值。正在更新非規範化數據庫表

我能做些什麼來以高性能的方式更新這些值?也就是說,如果TABLE2包含很多值(1.000.000或更多),那麼更新這兩個表(技術,實踐...)的最佳方法是什麼?

更新數據庫表所需時間會發生什麼?例如,用戶在加入涉及那些非規範化值的某些網站頁面時可能會遇到一些問題?如果是這樣,那是什麼,我該如何處理這種情況?

+0

您應該使用觸發器(或者兩個觸發器 - 每個表上一個觸發器(如果允許更新這兩個表)同步保留這些觸發器 - 以便在更改一個表時,更改會傳播到另一個表表。 – Flimzy

+0

@Flimzy - 正如你所說,爲了更新大型表格會有很多工作......性能呢? – user502052

+1

嗯,這意味着你每次更新兩張表時都會更新兩張表 - 所以表現可能大概是一半(取決於很多因素) - 但這就是你想要的,對吧?沒有保持數據一致所帶來的性能下降,就無法保證數據的一致性。現在,如果您的數據不必是實時一致的,您可能可以將傳播從一個表格傳輸到另一個表格,而不是每小時/每天/每週/其他,這可能會更有效,具體取決於您的情況。但根據你的問題中的信息,我不能說這是否適合你。 – Flimzy

回答

1

有處理這種情況的幾種方式:

  1. 您可以使用數據庫觸發器。據我所知,這不是一個數據庫不可知的選項,它的RoR支持是不存在的。如果您的情況完全不需要數據不一致這可能是實現您的目標的最高性能方式,但我是而不是的DB專家。
  2. 您可以使用批處理操作來定期同步兩個表。這種方法允許你的兩個表分開,然後每隔一段時間重新同步數據。如果你的情況允許這種漂移發生,這可以是一個很好的選擇,因爲它允許在非工作時間更新數據庫。如果您需要每5分鐘進行一次同步,您可能需要查看其他選項。這可以通過您的ruby代碼來處理,但需要某種類型的後臺作業運行器(cron,delayed_job,redis等)。
  3. 您可以在Rails模型中使用回調。您可以使用"after_update :sync_denormalized_data"。該回調將被包裝在數據庫級事務中(假設您的數據庫支持事務)。您將擁有Rails級別的代碼,一致的數據,並且無需每次都進行兩次寫入就可以執行後臺進程。
  4. 一些機制我沒有想到的....

這些類型的問題是非常專用。即使在相同的應用程序中,您也可以使用多種方法,具體取決於所涉及的靈活性和性能要求。

1

或者你可以維護標準化的數據集並擁有你的兩個denormized表。 並定期同步它們。 其他方式有一個規範化的表結構來維護數據(插入/更新/刪除)並編寫物化視圖來完成報告,這就是您通過非標準化視圖實現的目標。您可以根據您的要求爲物化視圖設置數據更新參數。