我被要求做某种报告(日志记录)服务。该员工在许多公司本地安装了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 出现任何性能问题之前,您的报告表中至少需要数百万条记录。