2011-05-12 41 views
8

我被要求提供某種報告(日誌記錄)服務。該員工在本地安裝了許多公司的Web應用程序(只是一些動態網站,用PHP編寫)。這個網絡應用程序是一種調查。所有的數據都保存在本地數據庫中,但現在要求這些數據(調查結果)在每次提交表單後也會發送到中央服務器。Rails 3中一個AR模型中的多個數據庫表格

有四種類型的調查。他們是這樣組織的,有很多項目,每個項目只能有一個類型的調查(STI在這裏?),調查屬於一個項目。每項調查都會收到來自本地應用的報告,因此它會有很多報告。記錄這個報告的Rails 3應用程序應該模仿這種邏輯。第一個問題是:這個AR結構對你有意義嗎?

Project-1--------1-Survey-1-------*-Report 

    Project 
    has_one :survey 
    has_many :reports, :through => :survey 

    Survey 
    belongs_to :project 
    has_many :reports 

    Report 
    belongs_to :survey 

第二個問題是關於一個AR模型有多個表。如果所有數據都將存儲在reports表中,表格將變得非常快速,並且對於屬於特定調查的報告的高效查詢可能會在一段時間後出現問題。也許最好每個調查都有單獨的表格?像reports_<survey_id>。這可能嗎?此外,我不知何故被迫使用MySQL,但如果有另一個更好的解決方案,我可以嘗試通過它。

如果你還在這裏,感謝您閱讀此:)

回答

4

第二個問題是關於一個AR模型有多個表。如果所有數據都將存儲在報告表中,表格將變得非常快速,並且對於屬於特定調查的報告進行有效查詢可能會在一段時間後出現問題。也許最好每個調查都有單獨的表格?像reports_。這可能嗎?

是的,這是可能的。

你可以這樣來做:

class Report < AR::Base 
    table_name_suffix = '' 
end 

Report.table_name_suffix = 'foo' 

UPDATE


# simple example of sharding model 

class Survey < AR::Base 
    has_many :reports 

    def shard_reports 
    Report.table_name_suffix = "_survey_#{self.id}" 
    returning(reports){ Report.table_name_suffix = "" } 
    end 

end 

Survey.first.reports_shard 
+0

謝謝,看起來很簡單。我希望這不會造成任何問題。 – Ernest 2011-05-17 12:27:12

+0

問題將會;) 因爲,你應該手動控制這個。並在創建調查時創建新的報告表 – Anton 2011-05-17 14:13:29

+0

@Anton什麼?這聽起來像一團糟。請參閱http://stackoverflow.com/questions/44145/database-sharding-and-rails – coreyward 2011-05-17 19:23:16

5

放在每個外鍵(例如Reports.survey_id)的索引,休息一段時間。你現在擔心的太多了。您將需要至少您的報表中的數百萬條記錄,纔會看到MySQL的任何性能問題。

+0

是的,也許我過慮。看到我最後的評論安東的答案。再次感謝您的提示。 – Ernest 2011-05-21 20:33:29

相關問題