Rails 3中一个AR模型中的多个数据库表

时间:2011-05-12 17:07:58

标签: ruby-on-rails-3 activerecord

我被要求提供某种报告(日志记录)服务。该员工在许多公司本地安装了Web应用程序(只是一些动态网站,用PHP编写)。这个网络应用程序是某种调查。所有数据都保存在本地数据库中,但现在要求的是,每个表单提交后,这些数据(调查结果)也将发送到中央服务器。

有四种类型的调查。他们以这种方式组织它,有很多项目,每个项目只能有一个每种类型的调查(这里是STI?),Survey属于一个项目。每个调查都会收到本地应用程序的报告,因此会有很多报告。记录此报告的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,但如果有另一个更好的解决方案,我可以尝试推动它。

如果您还在这里,感谢您阅读本文:)

2 个答案:

答案 0 :(得分:5)

在每个外键上放置索引(例如Reports.survey_id)并稍作休息。你现在对性能的担心太过分了。在您看到MySQL的任何性能问题之前,您需要在Reports表中至少数百万条记录。

答案 1 :(得分:5)

  

第二个问题是为一个AR模型提供多个表。如果所有数据都将存储在报告表中,则表格将变得非常快,并且在一段时间后对属于特定调查的报告进行有效查询可能会成为问题。也许每个调查都有单独的表格会更好吗?像reports_。这可能吗?

是的,这是可能的。

你可以这样做:

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

Report.table_name_suffix = 'foo'

<强>更新


# 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