Pregunta

Busco en las mejores maneras para almacenar las encuestas a una base de datos con los rieles. He comprobado a cabo este gran smerf Encuesta Plugin para rieles encuestas que almacena en una base de datos relacional con la siguiente tablas:


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)

Mirando el registro de un ejemplo básico encuesta que viene con smerf, hay un par de llamadas de base de datos:


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 [http://localhost/smerf_forms]

Mi pregunta es, ¿sería mejor a las encuestas tienda utilizando CouchDB (una base de datos documental), en lugar de una base de datos relacional, ya que las encuestas son más documentos que cualquier otra cosa? A lo largo de esas líneas son las siguientes preguntas:

  • ¿Es la salida anterior de acuerdo, en caso de que sea más optimizado? Es decir, la gente no se llenan las encuestas a cabo constantemente, por lo que no hay necesidad de que sean la velocidad del rayo, por lo que estoy preguntando si CouchDB en realidad sería más rápido
  • Ya está construido muy bien con este plugin, por lo que debería solo uso o sería un beneficio real para tener esto en CouchDB. Quiero estar haciendo un montón de análisis en esta encuesta de datos (un montón de búsqueda, clasificación, uniéndose ...).

Gracias por la ayuda.

Aún tratando de envolver mi cabeza en torno a cuándo y dónde utilizar CouchDB:)

¿Fue útil?

Solución

Estoy totalmente en desacuerdo con los comentarios de Sam:

  • Una encuesta y una respuesta de la encuesta son grandes ejemplos de documentos. En cargas de datos smerf la definición del formulario desde un archivo YAML en el disco y, aunque no estoy del todo familiarizado con smerf, supongo smerf_forms_users.responses es un conjunto en serie de respuestas.
  • Una base de datos orientada al documento no puede no ser analizado datos medios. CouchDB y MongoDB ambos tienen mecanismos para extraer y analizar información enterrado profundamente dentro de los documentos.

Además, cabe destacar que por serialising la definición del formulario a YAML no hay conexión izquierda entre las preguntas y las respuestas de todos modos así que no es sin duda una solución relacional. (Yo haría exactamente lo mismo si yo estaba usando un RDMBS para este - imaginar el esquema)

En una base de datos documental no haría más probable por documentos de la encuesta (uno por encuesta) y documentos de respuesta a las encuestas (uno por usuario por encuesta). Sencillo y limpio.

Sin embargo, a pesar de que creo que una base de datos documental sería un buen ajuste, estoy de acuerdo con el comentario de que si Toby trabajos de servidumbre lo utilizan en lugar de añadir una complejidad adicional.

En cuanto a cuál es el mejor - CouchDB vs MongoDB - que es en parte la preferencia personal y en parte los requisitos

.

Otros consejos

Las encuestas no son documentos, que son un conjunto de preguntas con muchos conjuntos de respuestas. Ellos punto clave es cuando se ejecuta una encuesta, que no quiere simplemente almacenar los resultados, pero analizarlos. Si se trata a los resultados como un solo documento, que hará difícil el análisis. Tener los datos en una base de datos relacional simplificará análisis.

Las encuestas son muy apropiado para bases de datos documentales. Lo más importante que preguntarse es: "¿podría almacenar esto como JSON hacer la vida más fácil"

Meebo utiliza para CouchDB respuestas de la encuesta, entre otras cosas. Almacenan más de 160 millones de documentos en un clúster CouchDB-Salón.

@Toby - es una cuestión de equilibrios. Con CouchDB te fiabilidad y escalabilidad, replicación que no es igualada por cualquier otra base de datos probados, y es todo a través de HTTP. Con MySQL o Mongo a obtener resultados rápidos para unos pocos usuarios, y alguna forma de indexación automática / planificación de consulta.

Si el plugin encuesta funciona ahora, lo usaría como es.

La adición de otro sistema de base de datos para su aplicación va a introducir una gran cantidad de trabajo extra ... el tiempo de desarrollo, además de la implementación y administración del sistema.

Además de esto, yo no creo CouchDB es tan buena como algunas de las alternativas ... He encontrado MongoDB a ser más rápido y más útil (consultas ad-hoc que realmente funcionan para empezar). MogoDB también tiene algunas bibliotecas de soporte sobresalientes para Rieles ahora.

Zodiac.NET es un buen ejemplo de almacenamiento de las encuestas. Se utiliza XML para la definición de la encuesta:

http://www.mentor-logic.com/index .php / productos / componentes / zodiacnet

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top