我被要求提供某种报告(日志记录)服务。该员工在许多公司本地安装了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,但如果有另一个更好的解决方案,我可以尝试推动它。
如果您还在这里,感谢您阅读本文:)
答案 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