Campo de estado binario en base de datos

Reduce, optimiza y limpia diseño de base de datos aplicando teoría de binarios para representar estados.

Hace unos años estaba implementando una aplicación web que debía enviar notificaciones vía correo electrónico a varias personas por el cargo que desempeñaban, y a su vez, era imprescindible registrar el estado de la notificación en una base de datos.

Era necesario conocer en cualquier momento si la acción había sido notificada a la persona que ocupaba cierto cargo para, a partir de ahí, desencadenar otras acciones.

Inicialmente se me ocurrió una idea muy sencilla que ciertamente resolvía el problema, pero como resultado teníamos un código algo tedioso y repetitivo, que no me resultaba agradable a la vista, aunque repito, era funcional.

Resulta que en esos días estaba viendo algunas aplicaciones interesantes de los números binarios, y se me ocurrió que sería interesante aplicarlos en mi caso práctico.

El presente artículo es para mostrarte cómo puede ser aplicada toda la teoría de binarios para representar estados en una base de datos.

Intentaré hacer de este un artículo que puedan seguir todos, aunque tener conocimientos de bases de datos va a ayudar muchísimo a que me entiendas.

Comenzamos.

Caso Práctico

Es necesario implementar un sistema de notificaciones que envíe por correo electrónico a varias personas la información asociada a la ocurrencia de un evento.

Es necesario almacenar en la base de datos el estado de las notificaciones, de modo que pueda consultar en cualquier momento si un evento fue notificado a una persona específica.

👉 Te puede interesar: Los 5 mejores sistemas gestores de bases de datos relacionales

Primer acercamiento: Varios campos en una tabla

Como primera solución quizás pienses como yo en aquel momento; en la tabla del evento agrego un campo notificado de tipo booleano por cada persona a la que tenga que registrar si fue notificada o no. Esta situación derivaría en un modelo similar al siguiente:

Diagrama Entidad - Relación sin campo binario

Como puedes observar en el diagrama, la tabla evento tendría su identificador, fecha de ocurrencia, nombre, descripción y un atributo por cada cargo al que deba registrar la notificación.

En este caso lo dejamos en 5 para que quedara clara la idea, pero pueden ser muchos más, así fue en nuestro caso real.

De este modo, todos los campos notificado_ tomarán valor false por defecto, y cuando se envíe la notificación cambiarán a true, registrando la acción.

¿Qué desventajas puede traer este esquema?

  • Estéticamente, el diseño de la base de datos se ve empobrecido cuando la cantidad de estados sobrepasa cierto umbral, al tener tablas muy grandes para atributos sencillos, similares y agrupables.
  • La calidad del código fuente resultante del sistema se verá afectada cuando sea necesario consultar alguno de estos estados a la vez, por tener que declarar explícitamente varias estructuras condicionales unidas y anidadas en ocasiones puntuales.

Resumiendo, en mi caso particular entendí que, aunque este esquema funcionaba a la perfección, había uno que resolvía el problema de un modo más elegante, y este es el que les presento a continuación.

Aplicando teoría de binarios

Si has llegado hasta aquí es muy probable que tengas conocimientos de informática o al menos que conozcas el sistema de numeración binario.

No obstante, creo que conviene definirlo como un sistema de numeración de base 2, en el que cualquier número puede ser representado con ceros y unos.

De este modo, para convertir un número decimal en binario, debemos dividir entre 2 y anotar los restos de las divisiones, y luego formar el número binario con los restos en orden inverso.

Por el contrario, para convertir un número binario en decimal, debemos tener en cuenta la posición del dígito de derecha a izquierda comenzando por 0.

👉 Te puede interesar: Los 5 mejores sistemas gestores de bases de datos no-relacionales

Esta posición será la potencia de 2 que representa cada uno de los dígitos. Se realiza la potencia de cada posición y se suman los resultados para obtener el número decimal.

Si quieres indagar más sobre este sistema de numeración te recomiendo el siguiente artículo.

¿Cómo se aplica esta teoría en nuestro caso práctico?

La idea es simple, en lugar de representar cada uno de los estados de notificación por cargo como un atributo separado de tipo booleano, pudiéramos crear un único atributo en binario donde cada bit represente la notificación a un cargo específico.

Por ejemplo:

Si tenemos que notificar a 5 cargos, creamos un binario de 5 bits, en formato abcde donde:

a – Representa la notificación al gerente general

b – Representa la notificación al jefe de ventas

c – Representa la notificación al director financiero

d – Representa la notificación al jefe de marketing

e – Representa la notificación al jefe de recursos humanos

El modelo quedaría representado de este modo:

Diagrama Entidad - Relación con campo binario

De este modo si   estado = 11001, entonces indica que se notificó al gerente general, al jefe de venta y al jefe de recursos humanos, y queda pendiente el director financiero y el jefe de marketing.

Hasta este punto hemos logrado representar las notificaciones en un solo atributo en la tabla evento, ahora vamos a ver como podemos utilizar operaciones entre binarios para comprobar y alterar estos valores fácilmente.

👉 Te puede interesar: Clientes gráficos para gestionar bases de datos

Comprobando estado

Aquí es donde se pone interesante el proceso. Supongamos que queremos comprobar si fue notificado a uno de los cargos para realizar una acción determinada, ¿cómo haríamos?

Para este caso tenemos que basarnos en las operaciones bit a bit, en este caso el operador binario AND.

Debemos realizar un AND bit a bit con un binario formado por ceros con el bit que representa la posición deseada activado, o sea, en 1. Por ejemplo:

Si queremos saber si le fue notificado al jefe de ventas activaríamos su posición y quedaría:

01000, y haciendo al AND bit a bit:

11001 AND 01000 = 01000

De este modo podemos comprobar si está activado o no un bit específico. Si no está activado entonces el resultado será 0, de lo contrario, será el número que buscamos.

Un ejemplo de cuando no está activado sería:

11001 AND 00100 = 00000

Este operador lo podemos usar en programación en cualquier estructura condicional y realizar una comprobación directa.

Activando estado

Cuando ya enviamos la notificación y queremos registrarlo en nuestro estado, entonces debemos realizar una operación de OR bit a bit entre el estado actual y un número binario formado por ceros con el bit que queremos modificar activado.

Por ejemplo, si queremos indicar que notificamos al jefe de director financiero hacemos un OR entre el estado actual (11001) y el binario formado para este caso (00100).

11001 OR 00100 = 11101, quedando activado nuestro tercer bit, que representa el estado de notificación al director financiero.

Si te fijaste en el diagrama de la tabla estado, el campo estado_notificacion lo representamos como un número entero, así que finalmente aplicamos una conversión y tenemos nuestro estado representado con un único valor.

👉 Te puede interesar: Cómo consultar el tamaño de las bases de datos y tablas

Desventajas de este esquema

  • A primera vista, no es un proceso trivial e involucra conocimiento básico del sistema de numeración binario.

Ventajas del esquema

  • Queda reducido la cantidad de campos de la tabla.
  • Se reduce la cantidad de código y aumenta su organización.
  • Diseño optimizado.

📝 NOTAS:

  • El proceso de notificación a los diferentes cargos está sujeto a condiciones específicas, por lo que no ocurren simultáneamente y es necesario registrar su ocurrencia.
  • Para simplificar el modelo ignoramos en el diagrama y el resto de las entidades que pueden complicar el caso de estudio y nos centramos únicamente en el evento que debemos notificar.

Es todo lo que quería mostrar por hoy, espero que les resulte esta información tan útil como a mí en su momento, y que puedas comenzar a aplicarla pronto en tus diseños de bases de datos.

Ahora te recomiendo que sigas con nosotros, si te gustan las buenas prácticas en el desarrollo de software te recomiendo nuestro artículo sobre los patrones de diseño en el desarrollo de software.

Deja un comentario

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.