2010-04-20 24 views
5

Utilizaré el complemento jQuery para presentar al usuario una interfaz agradable¿Qué es una forma mantenible de guardar "calificación por estrellas" en una base de datos?

La solicitud es mostrar 5 estrellas, hasta un puntaje total de 10 (2 puntos por estrella).
Por ahora pensado en utilizar 7/10 como un formato para ese valor, pero lo que si en algún momento en el futuro voy a recibir una petición como

Nos gustaría dar a los usuarios más opciones, vamos a aumentar la puntuación total a 20 (de modo que cada estrella contribuye con un máximo de 4 puntos)

voy a terminar con una mesa con una mezcla de valores de la columna "categoría": algunos serán como 7/10 mientras que otros ser como 14/20.

¿Está bien que tenga esta diferencia en la base de datos y la trate en la capa lógica para que sea coherente? ¿O se prefiere de otra manera para que consultar la tabla no dé lugar a resultados inconsistentes fuera de la aplicación?
Tal vez los valores de punto flotante podrían ayudarme, ¿es mejor almacenar ese valor como un número menor o igual a uno? Por lo tanto, en cada uno de los dos ejemplos, el valor resultante almacenado en la base de datos sería 0,7, como un número, no como un varchar, que también se puede consultar fuera de la aplicación.

¿Qué opinas?

Respuesta

7

KISS
Simplemente almacene el número de puntos y tenga lógica de aplicación para representarlo en las estrellas en IU.
Si los requisitos cambian en el futuro, ajustará la lógica y ejecutará un script de conversión si es necesario. Eso es todo.

+0

Kiss siempre tiende a escabullirse cuando busco una solución, gracias. –

+2

Creo que esta es la mejor opción, solo guárdela como 'tinyint' 1..5. Si los requisitos cambian en el futuro, es una secuencia de comandos de cinco minutos para actualizar todos los datos existentes a la nueva escala. Y si los requisitos * no * cambian (lo que probablemente sea más probable), entonces no ha perdido el tiempo implementando algo sin ningún beneficio. Además, si los requisitos cambian, es poco probable que cambien en la forma esperada;) –

+0

@codeka: nice point –

0

Usaría dos columnas: una para mantener la calificación y otra para mantener la calificación máxima. Como ese máximo podría cambiar en el futuro, lo mantendría en la fila con el resto de los datos. Podría usar entradas cortas para que la cantidad de espacio requerido, incluso para recuentos de filas grandes, sea muy pequeña.

8

hay tres opciones:

  1. almacenar el valor como una fracción (que es, de verdad, lo que probablemente iría con ya que es el más bajo de mantenimiento
  2. tienda el valor en dos columnas, una para la calificación y otro para el máximo
  3. tienda el valor como una sola columna con un máximo asumido, a continuación, actualizar todos los valores cuando cambia ese máximo.

la primera opción es la más po rtable, ya que el valor máximo y la representación de la calificación son totalmente del lado del cliente (del lado del cliente en lo que respecta a la base de datos, no del lado del cliente, como en la máquina del usuario).

La segunda parece arbitrariamente compleja, a menos que desee continuar mostrando una calificación de 7/10 como 7 con 10 estrellas en lugar de 14 con 20 estrellas.

El tercero requiere el trabajo menos adelantado, pero requiere una actualización masiva de la base de datos cuando se realizan cambios en la escala de calificación.

Solo para reiterar, Recomiendo almacenar el valor como float o double en la base de datos y aplicar cualquier escala que sea apropiada en el lado del cliente..

+0

1 para la respuesta bien explicada, pero creo Haré lo que sugirió z-boss. En mi caso, es lo más fácil de hacer y una conversión posible en el futuro no tomará tanto. –

0

Sugeriría almacenar sus puntajes como enteros simples - si la calificación es 7/10, almacene '7' en la base de datos.Si luego necesita cambiarlo a una escala de 20 puntos, solo ejecute una consulta de actualización para duplicar todos los números existentes. Puede usar flotadores si necesita más precisión, pero para la mayoría de los sistemas de calificación, los enteros deberían estar bien.

5

Lo almacenaría como un número entero simple medido de 100. De esta manera usted tiene mucha granularidad en caso de que quiera aumentar la precisión de las calificaciones en el futuro. No es necesario cambiar ningún valor almacenado existente tampoco.

+3

¿Por qué introducir una escala artificial (100) cuando podría simplemente almacenar el valor como un "flotante"? –

+0

Los usuarios generalmente dirán "Es un 7 de 10", que es solo una forma elegante de decir "Es 70%". Almacenar los datos como porcentaje es la solución lógica ya que los porcentajes nunca cambian. – dbemerlin

+1

¿Por qué no utilizar un bonito y redondo número como 256? :) –

0

Me gusta la idea de flotar, pero ninguna de las opciones es notablemente sobresaliente. Solo sugiero que, sea cual sea el mecanismo que elija, asegúrese de que la columna se llame apropiadamente.

La opción de flotante debería ser algo así como star_rating_ratio. El número entero simple debe ser star_points_out_of_ten. La escala de cien puntos podría ser star_rating_percent.

(he visto nombres de columna en el pasado que decía "por ciento", pero los datos fue una relación sencilla. Esto me quita el sueño!)

+0

Sugeriría nombrar valores enteros simplemente 'Puntos' y dar más detalles en el comentario. El nombre como 'star_points_out_of_ten' se volverá malo si el sistema cambia a, digamos, puntos de 20 y no usa estrellas en la IU. –

+0

@ z-boss: si la interpretación de una columna cambia, entonces su nombre debería cambiar también. "¡Pero luego, cada lugar que use la columna también tendrá que cambiar!" Sí. Ese es exactamente el punto. Los cambios de última hora deberían interrumpirse más temprano que tarde. –

Cuestiones relacionadas