简化Rails中广泛的非标准化表

时间:2010-04-20 19:04:14

标签: sql ruby-on-rails database-design mongodb

背景

我正在设计一个Rails应用程序来记录研究数据。其中大多数可以概念化作为“调查”(或“问卷”)数据。

我们已经有几个Access数据库和CSV文件来保存这些数据。现有设计是每个调查都有自己的表,每个问题有一列。其中许多表都有 100 + 列。

我刚收到一份报告,说明所有调查总共有多少列。计数 18,683 。是的,18,683列 - 很多比我预期的更多。 (我认为总共列数多于行数。有些表可能是退化的,但我知道有些表非常重要。)

为了减少问题的复杂性,我一直在想我会制作一些模型喜欢

  • 调查
  • 问题
  • 响应

此策略会将列数从数千个减少到少数几个。但是,我不确定如何通过Rails处理它,因为:

  • 我们需要不错的观点(比自动生成表单更好)进行多项调查。
  • 我们需要验证(有些调查很简单,但其他调查非常复杂)。
  • 我们需要将数据链接到其他记录并报告它。我的老板会期望每个调查的结果都是旋转(例如每个问题一列),以便他们可以对其进行分析。对此有优雅的解决方案吗?
  • 存储响应似乎比使用宽表更难(除非有一个“多态列”的良好策略)。
  • ...以及我可能希望将每个调查视为ActiveRecord模型的其他情况。

问题

我怎样才能简化这个“问题1,问题2,......,问题143”的怪异?虽然我确信没有一个完全优雅的解决方案,但最佳选择是什么?

如果他们能让事情变得更轻松,我会对替代数据库感兴趣。我对文档数据库(如mongodb或couchdb)不太熟悉,但据我所知,它们可能会有所帮助。

1 个答案:

答案 0 :(得分: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用户列表。