2008-10-16 22 views
11

Tengo una aplicación basada en la web que notifica a los usuarios de la actividad en el sitio por correo electrónico. Los usuarios pueden elegir qué tipo de notificaciones desean recibir. Hasta ahora hay alrededor de 10 opciones diferentes (cada una es verdadera/falsa).La mejor manera de almacenar varios indicadores en la base de datos

Actualmente estoy almacenando esto en un campo varchar como un 0 o 1 separados por comas. Por ejemplo: 1,0,0,0,1,1,1,1,0,0

Esto funciona, pero es difícil añadir nuevas banderas de notificación y realizar un seguimiento de qué bandera a la que pertenece la notificación. ¿Hay un estándar aceptado para hacer esto? Estaba pensando en agregar otra tabla con una columna para cada tipo de notificación. Entonces puedo agregar nuevas columnas si lo necesito, pero no estoy seguro de cuán eficiente es esto.

¡Gracias de antemano!

Respuesta

20

Usaría dos tablas. Una tabla almacena los datos del usuario y la otra las notificaciones a las que se suscriben. La segunda tabla se vería algo como esto:

create table notifications (
    user_id int, 
    notification_type int 
); 

me gustaría hacer una relación entre FK user_id y la identificación del usuario en la tabla de usuarios con una cascada de eliminación. Use tanto el user_id como el notification_type como la clave principal. Para verificar si un usuario desea una notificación en particular, simplemente haga una combinación entre las dos tablas y seleccione las filas donde el tipo de notificación coincide con el que está en cuestión. Si el conjunto de resultados no está vacío, el usuario desea la notificación.

Agregar nuevas notificaciones se vuelve trivial (como lo hace la eliminación). Simplemente agregue (elimine) un nuevo valor de tipo y permita que los usuarios lo acepten o no. Si desea mantener los tipos de notificación en una tabla para administrar a través de la aplicación que también funcionaría, pero sería un poco más complejo.

+0

Esta parece ser la mejor solución con mucho IMO. Almacenarlos todos en una columna no es muy extensible. Y almacenarlos como campos bool en una tabla significa que debe agregar un nuevo campo cada vez que haya un nuevo tipo de notificación. – Craig

+0

Funcionaría bien, especialmente si desea poder escanear los tipos de notificación. La normalización de – BCS

+0

es ideal para la extensibilidad, pero sufre un poco de rendimiento. – stephenbayer

0

Espero que sea mejor dejar que DB lo administre usando columnas Bool. Me parece recordar que algunos sistemas empaquetarán bools en bits (un nulo podría estropearlo). Para evitar el desorden, puede convertirlo en una tabla separada.

(No soy un DBA)

Editar: palmadas cabeza "Sólo sugiere exactamente lo que eres cosa del": b

2

yo usaría 10 campos de bits o bool diferentes. Pero si va a hacerlo en un campo, puede usar un mapa de bits 0x1111111111 como un número entero grande o un campo de texto sin la coma. He trabajado en diferentes aplicaciones, usando todas esas técnicas. Pero en realidad iría con los múltiples campos. Será mucho más fácil hacer declaraciones selectas en.

0

Si decide utilizar un campo poco como @stephenbayer menciona siempre se puede utilizar una vista sobre la mesa para que sea más fácil para los desarrolladores usar Esto entonces significa que usted todavía tiene el ahorro de espacio de el campo de bit y la facilidad de uso de columnas separadas por campo y mientras evita tener que analizar la columna

Como se mencionó, la tabla por separado es una excelente opción si desea que su solución sea más ampliable.El único inconveniente es un aumento en la complejidad.

Este es el intercambio. Si desea algo que sea realmente fácil de implementar y rápido, considere el campo de bit. Si desea algo más fácil de extender y mantener a un costo un poco más complejo, entonces, por supuesto, vaya a la mesa por separado. Si los votos le dicen algo, probablemente quiera seguir la implementación de la tabla por separado.

Cuestiones relacionadas