2011-05-12 59 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