2009-06-12 14 views
5

Estoy creando un sitio como StackOverflow in Rails, pero no estoy seguro de si es necesario que los votos de una pregunta se almacenen en una tabla separada en la base de datos.En un sitio como StackOverflow, ¿la pregunta y sus votos deben ser tablas separadas?

¿Hay alguna buena razón para separar los datos?

¿O podría almacenar los votos como una sola suma en un campo de la tabla de preguntas?

+3

Puedes ver la estructura que SO utiliza aquí: http://blog.stackoverflow.com/2009/06/stack-overflow-creative-commons-data-dump/ y aquí hay un buen tutorial si quieres importar esto datos fácilmente: http://www.brentozar.com/archive/2009/06/how-to-import-the-stackoverflow-xml-into-sql-server/ –

+0

Gracias. Eso es útil. Así que las insignias, los comentarios, las publicaciones, los usuarios y los votos son todas tablas separadas. –

Respuesta

5

¿Cómo sabría si un usuario votara una pregunta sin mantener una tabla de votos? O al igual que este sitio web que te mantiene con X votos al día, ¿cómo sabrías cuántos votos ha hecho un usuario en el día? ¿Cómo realizar un seguimiento de cuántos votos hacia arriba y hacia abajo ha realizado un usuario? Creo que las buenas prácticas de diseño casi gritan para que usted normalice los datos y mantenga una tabla de votos, tal vez manteniendo un campo actual +/- desnormalizado en la fila de preguntas para facilitar su recuperación.

+1

+1 por mencionar la normalización y la optimización de la velocidad por denormalización. – lexu

1

Piense en sus datos en varias dimensiones. Están sucediendo más cosas que la mera cantidad de votos. Hay:

  • que lo hubiera emitido
  • Cuando echaron el voto
  • El efecto (pensar como una transacción financiera) de los votos en cualquier número de partes

Puede permitirse descartar esta información? ¿Alguna vez lo necesitarás? En Stackoverflow, se debe saber si voté en algo para determinar si puedo votar; cuál fue el voto, así que puedo cambiarlo; el efecto de la votación para que pueda revertirse si la cambio; etc.

5

Sí! Piénselo desde la perspectiva de un objeto. En el desarrollo impulsado por modelos (objetos primero), tendría un contenedor (tabla) de preguntas y un contenedor de votos. Por supuesto, puedes simplemente enrollarlos en una forma agregada. Sin embargo, al hacerlo perderá muchos detalles métricos, como quién emite el voto, cuándo, etc. Realmente depende de si necesita los detalles o no. El espacio es barato, por lo que no es una buena idea no guardar los detalles. ¡Es difícil prever lo que se necesita en el futuro!

+0

Técnicamente hablando, si estás pensando en objetos, entonces se podría decir que una pregunta "tiene una cantidad de votos". – user109878

0

Los votos también deberían poder aplicarse tanto a las preguntas como a las respuestas, aunque ambas preguntas y respuestas podrían almacenarse en una tabla/clase llamada Post o similar, ya que son los mismos datos con un título diferente.

0

Al igual que las dos últimas respuestas, diga: mantenga una tabla de votos por separado.

Pero sería aconsejable crear una vista que agregue votos por usuario, por pregunta, etc. para que no tenga que hacer una consulta manual cuando necesite esa información.

JRH

0

Sí, me gustaría ir tan lejos como para decir que es vital para ayudar a reducir el likelyhood que una persona podría sesgar el resultado votando varias veces algo hacia arriba o hacia abajo.

Realmente tiene muy poco que ver con OOP, y más que ver con la prevención de exploits.

Por motivos de rendimiento, puede utilizar un conteo estático de votos en la tabla de preguntas que se actualiza cuando cambian los datos de votación de una pregunta. Sin embargo, no solo usaría un conteo de votos por sí solo a menos que realmente no le importen los resultados que las personas en particular estén predisponiendo.

Cuestiones relacionadas