database-design - software - lucidchart database
La mejor manera de almacenar varias banderas en la base de datos (5)
¿Usando MySQL?
Entonces, SET tipo de datos es la respuesta.
"El tipo de datos SET de MySQL se almacena como un valor entero dentro de las tablas MySQL, y ocupa de uno a ocho bytes, dependiendo de la cantidad de elementos disponibles". - http://dev.mysql.com/tech-resources/articles/mysql-set-datatype.html "
Tengo una aplicación 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).
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 agregar nuevos indicadores de notificación y hacer un seguimiento de qué bandera pertenece a cada 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 por adelantado!
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 DBA)
Editar: golpea la cabeza "Acabo de sugerir exactamente de qué eres": b
Si decide utilizar un campo de bit como @stephenbayer mencionado, siempre puede usar una vista en la tabla para que sea más fácil de usar para los desarrolladores. Esto significa que aún tiene el ahorro de espacio del campo de bit y la facilidad de uso de columnas separadas por campo y al mismo tiempo evita tener que analizar la columna.
Como se mencionó, la tabla separada es una excelente opción si desea que su solución sea más extensible. 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.
Yo usaría 10 campos diferentes de bit o bool. 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.
Yo usaría dos tablas. Una tabla almacena los datos del usuario y la otra las notificaciones a las que se suscriben. La segunda mesa se vería así:
create table notifications (
user_id int,
notification_type int
);
Haría una relación FK entre user_id y la identificación del usuario en la tabla de usuarios con una cascada en delete. 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.