在 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 中简化宽的、非规范化的表的主要内容,如果未能解决你的问题,请参考以下文章

如果期望的行为是让查询自动添加新列,可以选择 * 吗? [复制]

要求非规范化数据库的用户

ActiveRecord - 非规范化案例研究

非规范化表和重复数据

更新 Cassandra 中的非规范化数据

通讯录数据库设计:非规范化?