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



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

有四种类型的调查。他们以这种方式组织起来,有很多项目,每个项目只能有一个每种类型的调查(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,但如果有另一个更好的解决方案,我可以尝试推动它。

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

第二个问题是关于为一个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

在每个外键(例如 Reports.survey_id)上放置一个索引并喘口气。你现在太担心性能了。在看到 MySQL 出现任何性能问题之前,您的报告表中至少需要数百万条记录。

相关内容

  • 没有找到相关文章

最新更新