Хранение опросов в CouchDB против MySQL - PullRequest
1 голос
/ 25 января 2010

Я ищу наилучшие способы хранения опросов в базе данных с помощью Rails. Я проверил этот замечательный Smerf Survey Plugin для Rails , который сохраняет опросы в реляционной базе данных со следующими таблицами:


smerf_forms: name, code
smerf_forms_users: user_id, smerf_form_id, responses (as text)
smerf_responses: smerf_forms_user_id, question_code, response (as text)

Глядя на журнал для базового примера опроса, который поставляется с Smerf, есть несколько вызовов базы данных:


Processing SmerfFormsController#create (for 127.0.0.1 at 2010-01-24 20:09:58) [POST]
  Parameters: {"responses"=>{"g1q3a4s1"=>"", "g1q1a3s1a3s1"=>"", "g1q1"=>"1", "g2q1"=>{"1"=>"1"}, "g1q2"=>"2", "g1q3"=>{"1"=>"1", "2"=>"2", "3"=>"3"}, "g2q3"=>"12", "g1q4"=>["4"], "g1q5"=>["1", "3"], "g2q1a4s1"=>""}, "commit"=>"Press to Save your answers", "authenticity_token"=>"a4aDgvjzX0UK9HrQFdpdPyfALWGL22rcjRZfxDY3Ww0=", "smerf_form_id"=>"1"}
  SmerfForm Load (1.0ms)   SELECT * FROM "smerf_forms" WHERE ("smerf_forms"."id" = 1) 
  SmerfFormsUser Create (0.5ms)   INSERT INTO "smerf_forms_users" ("responses", "smerf_form_id", "user_id") VALUES('--- !map:HashWithIndifferentAccess 
g1q3a4s1: ""
g1q1: "1"
g1q1a3s1a3s1: ""
g1q2: "2"
g2q1: !map:HashWithIndifferentAccess 
 "1": "1"
g1q3: !map:HashWithIndifferentAccess 
 "1": "1"
 "2": "2"
 "3": "3"
g1q4: 
- "4"
g2q3: "12"
g1q5: 
- "1"
- "3"
g2q1a4s1: ""
', 1, -1)
  SmerfResponse Create (0.2ms)   INSERT INTO "smerf_responses" ("response", "smerf_forms_user_id", "question_code") VALUES('1', 1, 'g1q1')
  SmerfResponse Create (0.1ms)   INSERT INTO "smerf_responses" ("response", "smerf_forms_user_id", "question_code") VALUES('2', 1, 'g1q2')
  SmerfResponse Create (0.1ms)   INSERT INTO "smerf_responses" ("response", "smerf_forms_user_id", "question_code") VALUES('1', 1, 'g2q1')
  SmerfResponse Create (0.1ms)   INSERT INTO "smerf_responses" ("response", "smerf_forms_user_id", "question_code") VALUES('1', 1, 'g1q3')
  SmerfResponse Create (0.3ms)   INSERT INTO "smerf_responses" ("response", "smerf_forms_user_id", "question_code") VALUES('2', 1, 'g1q3')
  SmerfResponse Create (0.1ms)   INSERT INTO "smerf_responses" ("response", "smerf_forms_user_id", "question_code") VALUES('3', 1, 'g1q3')
  SmerfResponse Create (0.1ms)   INSERT INTO "smerf_responses" ("response", "smerf_forms_user_id", "question_code") VALUES('4', 1, 'g1q4')
  SmerfResponse Create (0.1ms)   INSERT INTO "smerf_responses" ("response", "smerf_forms_user_id", "question_code") VALUES('12', 1, 'g2q3')
  SmerfResponse Create (0.1ms)   INSERT INTO "smerf_responses" ("response", "smerf_forms_user_id", "question_code") VALUES('1', 1, 'g1q5')
  SmerfResponse Create (0.1ms)   INSERT INTO "smerf_responses" ("response", "smerf_forms_user_id", "question_code") VALUES('3', 1, 'g1q5')
Rendering smerf_forms/edit
Rendered smerf_forms/_smerf_form (11.0ms)
Completed in 51ms (View: 17, DB: 3) | 200 OK [<a href="http://localhost/smerf_forms]" rel="nofollow noreferrer">http://localhost/smerf_forms]</a>

У меня вопрос: лучше ли хранить опросы с использованием CouchDB (документно-ориентированная база данных) вместо реляционной базы данных, поскольку опросы - это больше документов, чем что-либо еще? В том же духе эти вопросы:

  • Хорошо ли вышеприведенный вывод, лучше ли его оптимизировать? Я имею в виду, что люди не будут заполнять опросы постоянно, поэтому им не нужно быть молниеносным, поэтому мне интересно, будет ли CouchDB на самом деле быстрее
  • Он уже скомпонован с этим плагином, так что я должен просто использовать его или было бы реальным преимуществом иметь его в CouchDB. Я хочу сделать МНОГО анализа этих данных опроса (много поиска, сортировки, объединения ...).

Спасибо за помощь.

Все еще пытаюсь обернуть мою голову, когда и где использовать CouchDB:)

Ответы [ 5 ]

3 голосов
/ 25 января 2010

Я категорически не согласен с комментариями Сэма:

  • Опрос и ответ на опрос являются отличными примерами документов. Фактически, smerf загружает определение формы из файла YAML на диск и, хотя я совсем не знаком с smerf, я предполагаю, что smerf_forms_users.responses - это сериализованный набор ответов.
  • Документно-ориентированная база данных не означает, что данные не могут быть проанализированы. CouchDB и MongoDB имеют механизмы для извлечения и анализа информации, скрытой глубоко внутри документов.

Также обратите внимание, что при сериализации определения формы в YAML все равно не останется никакой связи между вопросами и ответами, поэтому, возможно, это не реляционное решение. (Я бы сделал то же самое, если бы использовал для этого RDMBS - представьте схему!)

В базе данных, ориентированной на документы, наиболее вероятно, что документы по опросам (по одному на опрос) и документы по ответам на опрос (по одному на пользователя на опрос). Просто и чисто.

Однако, несмотря на то, что я думаю, что база данных документов подойдет, я согласен с комментарием Тоби, что если крепостные работают, используйте их, а не добавляйте дополнительную сложность.

Что касается того, что лучше - CouchDB против MongoDB - это отчасти личное предпочтение и частично требования.

2 голосов
/ 30 января 2010

Обзоры отлично подходят для баз данных документов. Главное, что нужно спросить себя: «Может, хранение этого в JSON облегчит мою жизнь?»

Meebo, среди прочего, использует CouchDB для ответов на опрос. Они хранят более 160 миллионов документов в кластере CouchDB-Lounge.

@ Тоби - это вопрос компромиссов. С CouchDB вы получаете проверенную надежность и масштабируемость, репликацию, которой не соответствует ни одна другая база данных, и все это через HTTP. С MySQL или Mongo вы получаете быстрые результаты для нескольких пользователей и некоторую форму автоматического индексирования / планирования запросов.

2 голосов
/ 25 января 2010

Опросы не являются документами, они представляют собой набор вопросов с множеством ответов. Их ключевой момент - когда вы проводите опрос, вы не хотите просто сохранять результаты, а анализировать их. Если вы рассматриваете результаты как один документ, это затруднит анализ. Наличие данных в реляционной базе данных упростит анализ.

1 голос
/ 25 января 2010

Если плагин опроса работает сейчас, я бы использовал его как есть.

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

Кроме того, я просто не думаю, что CouchDB так хорош, как некоторые альтернативы ... Я обнаружил, что MongoDB быстрее и полезнее (специальные запросы, которые действительно работают для начала). MogoDB также имеет несколько выдающихся библиотек поддержки для Rails.

0 голосов
/ 15 февраля 2010

Zodiac.NET является хорошим примером хранения опросов. Он использует XML для определения опроса:

http://www.mentor -logic.com / index.php / продукты / компоненты / zodiacnet

...