Упрощение широких ненормализованных таблиц в Rails - PullRequest
1 голос
/ 20 апреля 2010

Фон

Я разрабатываю приложение Rails для записи данных исследований. Большая часть из них может быть концептуализирована как данные "опроса" (или "вопросника").

У нас уже есть несколько баз данных Access и файлов CSV, в которых хранятся эти данные. Существующий дизайн состоит в том, что у каждого опроса есть своя собственная таблица с одним столбцом на вопрос. Многие из этих таблиц имеют столбцы 100 + .

Я только что получил отчет о количестве столбцов для всех опросов. Количество 18 683 . Да, 18 683 столбца - на много больше, чем я ожидал. (Я думаю, что столбцов больше, чем строк, всего. Некоторые таблицы могут быть рудиментарными, но я знаю, что некоторые из них очень важны.)

Чтобы уменьшить сложность проблемы, я подумал, что я бы сделал несколько моделей вроде :

  • Обзор
  • Вопрос
  • Ответ

Эта стратегия позволит сократить количество столбцов с тысяч до нескольких. Однако я не уверен, как подойти к нему через Rails, потому что:

  • Нам нужно хороших видов (лучше, чем автогенераторные формы) для нескольких опросов.
  • Нам нужна проверка (некоторые опросы простые, а другие довольно сложные).
  • Нам нужно связать данные с другими записями и сообщить об этом. Мои боссы ожидают, что результаты каждого опроса будут развернуты (например, один столбец на вопрос), чтобы они могли его проанализировать. Есть ли для этого элегантное решение?
  • Хранение ответов кажется более сложным, чем с широкими таблицами (если не существует хорошей стратегии для «полиморфного столбца»).
  • ... и другие случаи, когда я бы хотел рассматривать каждый опрос как модель ActiveRecord.

Вопрос

Как я могу упростить это чудовище "вопрос1, вопрос2, ..., вопрос143"? Хотя я уверен, что не совсем элегантное решение, какой лучший выбор?

Я бы заинтересовался альтернативными базами данных, если бы они упростили ситуацию. Я не очень знаком с базами данных документов (например, mongodb или couchdb), но, насколько я знаю, они могут быть полезны.

1 Ответ

1 голос
/ 21 апреля 2010

Я думаю, что 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, если вы решите исследовать это направление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...