在 Rails 中简化宽的、非规范化的表
Posted
技术标签:
【中文标题】在 Rails 中简化宽的、非规范化的表【英文标题】:Simplifying wide, unnormalized tables in Rails 【发布时间】:2010-04-20 19:04:13 【问题描述】:背景
我正在设计一个 Rails 应用程序来记录研究数据。其中大部分可以概念化为“调查”(或“问卷”)数据。
我们已经有几个 Access 数据库和保存这些数据的 CSV 文件。现有的设计是每个调查都有自己的表格,每个问题有一列。其中许多表都有 100+ 列。
我刚刚收到一份报告,显示所有调查总共有多少列。计数为 18,683。是的,18,683 列——比我预期的要多很多。 (我认为总共列多于行。有些表可能是退化的,但我知道有几个非常重要。)
为了降低问题的复杂性,我一直在想我会制作一些模型like:
调查 问题 响应此策略会将列数从数千减少到少数。但是,我不确定如何通过 Rails 处理它,因为:
我们需要漂亮的视图(比自动生成表单更好)来进行一些调查。 我们需要验证(有些调查很简单,但有些则相当复杂)。 我们需要将数据链接到其他记录并报告。我的老板希望每个调查的结果都透视(例如每个问题一列),以便他们可以分析它。有没有一个优雅的解决方案? 存储响应似乎比使用宽表更困难(除非“多态列”有很好的策略)。 ...以及我可能希望将每个调查视为 ActiveRecord 模型的其他情况。问题
如何简化这个“question1, question2, ..., question143”的怪物?虽然我确信没有完全优雅的解决方案,但最好的选择是什么?
如果它们能让事情变得更容易,我会对替代数据库感兴趣。我对文档数据库(如 mongodb 或 couchdb)不是很熟悉,但据我所知,它们可能会有所帮助。
【问题讨论】:
来到这里希望进行相同类型的转换,并好奇一年后您决定最终做什么。 对于那个项目,我只是忍受了所有的列。如果我今天要重新开始,我想我会做 CouchDB 或类似的东西。旋转问题仍然存在,但这不是一个可怕的问题。 【参考方案1】:我认为 MongoDB 会是很好的解决方案;绝对值得您花时间熟悉它。无模式会使事情变得很容易。例如,您可以将每个调查存储在如下所示的文档中:
survey = :title => "Thoughts on X",
:questions => [
:text => "What year were you born?",
:type => "Fill in the blank",
,
:text => "Pick an option:",
:type => "multiple_choice",
:choices => ["a", "b", "c", "d"]
]
然后,您可以编写能够解释这些调查文档并将其呈现在网络上的代码。您当然可以在每个文档中包含特殊的验证信息等。
单独的集合可以包含用户响应。您可以使用 MongoDB 的 map-reduce 进行聚合。
只是一些初步的想法。如果您决定探索这个方向,请跳入 MongoDB 用户列表。
【讨论】:
以上是关于在 Rails 中简化宽的、非规范化的表的主要内容,如果未能解决你的问题,请参考以下文章