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

Ern*_*est 8 activerecord ruby-on-rails-3

我被要求提供某种报告(日志记录)服务.该员工在许多公司本地安装了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
Run Code Online (Sandbox Code Playgroud)

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

此外,我不知何故被迫使用MySQL,但如果有另一个更好的解决方案,我可以尝试推动它.

如果你还在这里,谢谢你读这个:)

cor*_*ard 5

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


Ant*_*ton 5

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

对的,这是可能的。

您可以这样操作:

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

Report.table_name_suffix = 'foo'
Run Code Online (Sandbox Code Playgroud)

更新


# 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
Run Code Online (Sandbox Code Playgroud)