Diseño y consultas de una base de datos No SQL

Base de datos No SQL: Diseño y consultas

Las farmacias manejan grandes volúmenes de medicamentos por lo que es necesario un software de gestión de farmacia para automatizar ciertos procesos. En este caso nos centraremos en la administración del inventario. Para poder administrar el stock primero se debe poder almacenar toda la información relacionada con el sistema de administración de farmacia, por lo que primero se debe contar con una base de datos, anteriormente se había trabajado con bases de datos relacionales, en esta ocasión se trabajará con bases de datos no relacionales (No SQL) usando Mongodb.

MongoDB es una base de datos de documentos, es escalable y flexible, su uso es gratuito y permite almacenar datos en documentos similares a JSON, por lo que la estructura de los datos puede cambiar en el tiempo [1].

Teniendo en cuenta el sistema que se desea desarrollar y pensando en las necesidades básicas de una farmacia, se plantean 7 colecciones:


Los objetos de cada una de las colecciones se crearon en archivos json, estos se importaron a MongoDB para la creación de las colecciones. Solo se crearon referencias en los casos donde las relaciones fueron de uno a muchos. Cada colección, los campos y las referencias se describen detalladamente en el diccionario de datos. Igualmente se presentan algunos objetos de las colecciones.

Diccionario de datos

Colección: Inventario

Esta es la colección principal. Es creada debido a que en toda estructura de salud es indispensable un inventario funcional y una gestión rigurosa para mantener un stock permanente de medicamentos, reducir costos, ahorrar tiempo y facilitar la evaluación continua del consumo.

Campos:

  • _id: Campo donde se almacena información tipo “ObjectID” cuyo valor identifica cada inventario generado. Cada inventario queda registrado con un identificador para mantener un control constante de los movimientos que realiza la farmacéutica y generar reportes de la situación.

  • Fecha: Campo donde se almacena información tipo “varchar”. Indica el día en que se realiza el inventario con la finalidad de planificar mejor las reposiciones y llevar un control de la cantidad de existencias de un medicamento almacenado en un momento dado.

  • Stock: Campo donde se almacena información tipo “int”. Indica la cantidad actual de medicamentos con el objetivo de llevar el control de los medicamentos que se encuentran disponibles en la farmacéutica para garantizar que los clientes encuentren siempre en la farmacia aquellos productos que necesitan.

  • Medicamento: (Referencia) Hace referencia a la colección Medicamentos para poder identificar el medicamento en particular al que se le está haciendo el inventario. La relación es de uno a muchos, un medicamento puede tener varios inventarios.






Colección: Medicamentos

Esta colección contiene la información que caracteriza la base de datos. Esta colección contiene toda la información relacionada con los medicamentos.

Campos:

  • _id: Campo donde se almacena información tipo “ObjectID” cuyo valor identifica cada medicamento existente en el inventario y que está en espera de su venta o comercialización. Éste, permite llevar un registro en el que se diferencia cada medicamento mediante un número de referencia (id).

  • Medicamento: Campo donde se almacena información tipo “varchar”. Indica el nombre del medicamento registrado con la finalidad de identificar, con mayor facilidad, el producto en stock.

  • Presentación: Campo donde se almacena información tipo “varchar”. Indica el tipo de encapsulado con el que los proveedores comercializan su producto.

  • Dosificación: Campo donde se almacena información tipo “varchar”. Indica la dosis que incluye cada unidad de empaquetado con su respectiva unidad de medida.

  • Fecha_vencimiento: Campo donde se almacena información tipo “varchar”. Indica el día de caducidad del medicamento.

  • Stock: Campo donde se almacena información tipo “int”. Indica la cantidad de un medicamento en particular disponible en el inventario. Permite identificar aquel stock que no se ha vendido en meses y que no se debe comprar de nuevo o comprar en menor cantidad.

  • Tipo_medicamento: Campo donde se almacena información tipo “int” cuyo valor identifica el grupo del cual hace parte un medicamento en específico. Este id sirve como punto de partida para reconocer, en la colección, la categoría correspondiente para el medicamento analizado y así obtener el rendimiento de la gestión esperado.

  • Proveedores: (Referencia) Lista con las referencias a los proveedores que distribuyen un medicamento o producto en específico. Esta referencia sirve como punto de partida para reconocer, en cada objeto, el proveedor que abastece el sistema farmacéutico con un medicamento específico. Se hace como una referencia puesto que un solo medicamento puede tener varios proveedores.




Colección: Proveedores

Esta colección contiene información básica acerca de los diferentes proveedores que abastecen la farmacéutica con los medicamentos necesarios. En todo sistema farmacéutico de venta al público, los proveedores deben estar constantemente surtiendo los productos y medicamentos con la mejor calidad y condiciones de pago. Por ende, es importante conocer la información relacionada con los proveedores ya que con esto se obtiene agilidad en el suministro de medicamentos, esto genera eficiencia administrativa.

Campos:

  • _id: Campo donde se almacena información tipo “int” cuyo valor identifica el proveedor que distribuye un medicamento o producto en específico. Este id sirve como punto de partida para reconocer el proveedor que abastece el sistema farmacéutico con un medicamento específico.

  • Proveedor: Campo donde se almacena información tipo “varchar”. Indica el nombre del proveedor que abastece el sistema farmacéutico con la finalidad de identificarlo con mayor facilidad.

  • NIT: Campo donde se almacena información tipo “int”. Indica el Número de Identificación Tributaria y sirve para identificar a cada proveedor, dentro del territorio nacional, en caso de existir confusiones con el nombre de este.

  • Dirección: Campo donde se almacena información tipo “varchar”. Hace referencia a la ubicación, si existe, del proveedor que abastece al sistema farmacéutico puesto que muchos de ellos posiblemente no cuentan con servicio de despacho, solo cuentan con un punto de venta fijo.

  • Persona encargada: Campo donde se almacena información tipo “varchar” e indica el nombre de la persona que cumple un papel fundamental al representar a la empresa que abastece el sistema farmacéutico. Dicha persona será la encargada de controlar todo el proceso de abastecimiento y de estar en comunicación con la farmacéutica.

  • Número de contacto: Campo donde se almacena información tipo “int”. Indica el número de contacto de la persona encargada con la finalidad de tener un medio de comunicación entre la persona que representa la empresa que abastece el sistema farmacéutico y la farmacéutica y así hacer más ágil el proceso de suministro.

  • Correo electrónico: Campo donde se almacena información tipo “varchar”. Indica el correo electrónico correspondiente a la empresa o persona encargada de esta. Muchas empresas deciden tener, como principal medio de comunicación, el correo electrónico para el reporte de quejas o de inconvenientes que se tengan con sus productos. La farmacéutica requiere este medio ante cualquier eventualidad que se presente con los medicamentos o productos suministrados.




Colección: Tipos_medicamentos

Esta colección contiene información básica acerca de las diferentes clasificaciones que pueden tener los medicamentos según el órgano en que actúa, la acción terapéutica y la estructura química. Esta clasificación permite categorizar cada medicamento en un grupo o categoría igual (analgésicos, antidiarreicos…) con el objetivo primordial de obtener el mejor ordenamiento posible o el más claro para que, llegado el momento de la búsqueda de determinado medicamento que ha sido clasificado, éste resulte más fácil de encontrar. Su especialización por categorías y organización son claves para que la farmacéutica tenga un sistema de gestión mucho más eficiente.

Campos:

  • _id: Campo donde se almacena información tipo “int” cuyo valor identifica el grupo del cual hace parte un medicamento en específico. Este id sirve como punto de partida para reconocer, en la colección Medicamentos, la categoría correspondiente para el medicamento analizado y así obtener el rendimiento de la gestión esperado.

  • Tipo: Campo donde se almacena información tipo “varchar”. Indica el nombre del tipo de medicamento con la finalidad de identificar, con mayor facilidad para la persona que manipula el inventario, el grupo del cual hace parte el medicamento estipulado y así realizar una búsqueda de manera más simple.


Colección: Ventas

Esta colección hace referencia a la información que abarca una venta completa, donde se va a registrar cada unidad que sale de cada medicamento. Esto ayuda a hacer un sondeo de las ventas que ha realizado la farmacia, para luego compararlas con la cantidad de medicamentos que salieron del inventario. Allí, se almacena el nombre del comprador, el nombre del personal encargado de la venta, la cantidad y el medicamento en cuestión.

Campos:

  • _id: Campo donde se almacena información tipo “ObjectID”, cuyo valor corresponde a un número de identificación de la venta realizada. Con éste, se puede hacer referencia a una venta en específico para verificar los datos internos de la misma, como lo son: cantidad de ventas realizadas, quién compra, quién vende y el medicamento que sale de stock.

  • Cantidad: Es un campo donde se almacena información tipo “int”. Corresponde a la cantidad vendida de un medicamento en particular.

  • Mes: Almacena un “varchar” con el mes en que se realizó la venta.

  • Comprador: (Referencia) Hace referencia a la colección Comprador que tiene la información personal de los usuarios de la farmacia. La relación es de uno a muchos, un comprador puede aparecer en varias ventas.

  • Personal: (Referencia) Hace referencia a la colección Personal que contiene la información de los trabajadores de la farmacia. El personal de la farmacia puede hacer varias ventas, por lo que la relación es de uno a muchos.

  • Medicamento: (Referencia) Hace referencia a la colección Medicamentos. Funciona como un registro que remite la información del medicamento respectivo. La relación es de uno a muchos.



Colección: Comprador

Esta colección contiene información del usuario que compra el medicamento. Sirve para llevar un registro de los clientes de la farmacia.

Campos:

  • _id: Campo en el que se ingresa información “int”. Hace referencia al número que identificará al usuario que compra el medicamento, en este caso la cédula.

  • Nombre: Es un campo que almacena información tipo “varchar”. Este indica el nombre del comprador.




Colección: Personal

Esta colección abarca la información del personal de la farmacia. Sirve para llevar un registro de ventas por persona encargada del área, y así, poder hacer una comparativa mes a mes.

Campos:

  • _id: Campo en el que se ingresa información “int”. Hace referencia al número que identificará al empleado en las ventas y a la hora de hacer el inventario, en este caso es la cédula.

  • Nombre: Es un campo que almacena información tipo “varchar”. Este indica el nombre del vendedor.

  • Número de contacto: Campo donde se almacena información tipo “varchar”. Este es el número de contacto del personal de la farmacia, se almacena esta información en caso de ser necesario contactarse.






Consultas

  • Encontrar la información de la venta de un medicamento en específico realizada por un vendedor en particular:

Descripción: En este caso, la consulta requiere datos almacenados dentro de la misma BD (base de datos), donde la rama principal radica en la colección “Ventas”. Allí, mediante el comando “find”, se encuentra la información según los parámetros y condiciones que se le añaden a continuación. Adicionalmente, se hace uso del operador lógico “and”, de modo que, el resultado de la búsqueda, muestre el dato que coincida con las dos condiciones ingresadas. Esas dos condiciones corresponden al medicamento y al vendedor en particular, dentro de la colección “Ventas” con sus debidas referencias (id propias).


Justificación: Dentro del reporte de un inventario, es significativamente útil saber quién ha vendido los medicamentos que salen de la farmacia. Ello, para tener un control del personal y sus ventas realizadas, seguridad y gestión de productos, de manera que la farmacia se cure en salud, en caso de un posible reclamo. Además, el comando muestra el mes en que se realizó la venta para ser más concisos en la información consultada.


Código:

db.Ventas.find({$and:[{"medicamento":DBRef("Medicamentos",2)},{"Personal":DBRef("personal",33112456)}]})




  • Encontrar las ventas realizadas de un medicamento en un mes en específico.
Descripción: Ahora, dentro de la misma colección “Ventas”, mediante el método “aggregate”, se agregan a un nuevo documento los parámetros que se le ingresan posteriormente, pero, mediante “$group”, se agrupan dentro del documento según el orden como se ingresen y según el id especificado, es decir, por cada agrupación distinta, genera un documento diferente.


Justificación: Para conocer las salidas del inventario por cada medicamento, es necesario llevar un registro de las ventas que se hacen por mes. Éste resultado, funciona como un indicador que le ayuda al farmaceuta a llevar un conteo de la eficiencia por mes, verificar qué medicamentos  se venden en mayor cantidad y compararlo con los demás en stock.


Código:

db.Ventas.aggregate([{$group:{_id:{medicamento: "$Medicamento", Mes:"Enero"}, 
total: {$sum:'$Cantidad'}}}])




  • Encontrar los medicamentos que vende un proveedor en específico:
Descripción: Teniendo la colección de “Medicamentos”, donde internamente se referencia a la colección de “Proveedores”, se usa el comando “find”, para encontrar los medicamentos que ofrece el proveedor correspondiente al id que se ingrese como parámetro de búsqueda.

Justificación: Al momento de requerir entradas a la farmacia (comprar medicamentos), es indispensable para el personal de la farmacia, conocer qué medicamentos vende cierto proveedor. De esta manera, le es más fácil saber a quién comprar, verificando la información con un simple id. En este caso, el proveedor con el id: 2 (Sumpharma S.A), vende Acetaminofén y paracetamol.

Código:

db.Medicamentos.find({"proveedores.$id":2}).pretty()




  • Encontrar los medicamentos con un stock bajo en el inventario:

  • Descripción: En esta consulta se necesita información que está almacenada en documentos de diferentes colecciones. La función $lookup facilita la “unión” de las colecciones “Inventario” y “Medicamentos”, devolviendo resultados que coinciden en los id de las colecciones especificadas. Para este caso, se consultan los id de los medicamentos en la colección “Medicamentos” que coinciden con el id del stock de la colección “Inventario” menor o igual a 40 unidades retornando el nombre del medicamento que cumple con la condición. 

    Justificación: La gestión del stock tiene un impacto directo sobre el funcionamiento de la farmacia y la rentabilidad. Tener esta gestión ayuda a ahorrar dinero ya que pueden quedar medicamentos que con el tiempo pueden cumplir su fecha de vencimiento y no se venden, por ende, los medicamentos van a estar mejor distribuidos y se optimizará el espacio de almacenamiento. Además, ayuda a equilibrar las ventas y el gasto teniendo mayor liquidez.

    Código:

    db.Inventario.aggregate([{$lookup:{from: "Medicamentos",localField:"Medicamento.$id", foreignField: "_id", as: "medicamento"}},{$match:{"Stock": {$lte:40}}},{$project:{"medicamento.medicamento":1,"Stock":1,"_id":0}}])





    • Encontrar los medicamentos que se encuentran próximos a vencer:

    Descripción: Este método tiene la finalidad de buscar documentos dentro de una colección específica. Dentro de este método, también se pueden hacer uso de operadores lógicos para filtrar la información que es requerida en el momento. Para esta consulta se utilizó el método “find”, el operador lógico “and” y los operadores “lte” y “gt” para filtrar los medicamentos que estuvieran próximos a su fecha de vencimiento. En este ejemplo se retornaron los medicamentos que tuvieran fecha de vencimiento entre 2022-09-01 y 2022-03-01.


    Justificación: La fecha de vencimiento de los medicamentos es vital debido a que garantiza la seguridad, calidad y eficacia de los mismos. Cuando un medicamento cumple la fecha de vencimiento, no hay garantía de que este sea eficaz pudiendo causar problemas mayores como es la intoxicación de uno de los clientes de la farmacia.


    Código:

    db.Medicamentos.find({$and:[{"fecha_vencimiento":{$lte:"2022-09-01"}},{"fecha_vencimiento": {$gt:"2022-03-01"}}]})






    Conclusiones
    • Las bases de datos NoSQL son más flexibles que las bases de datos relacionales, pues permiten adaptarse con mayor facilidad a la necesidad del proyecto y sus colecciones no deben tener una estructura idéntica como las entidades en las bases de datos relacionales.
    • Generalmente se utilizan datos embebidos cuando se tienen relaciones de documentos “uno a uno” ó “uno a pocos” ya que ofrecen mejor rendimiento al permitir obtener los datos mediante una única operación, pero pueden llevar a la duplicidad de datos.
    • Cuando se tienen relaciones “uno a muchos” es recomendable utilizar referencias entre los documentos ya que se evita la duplicidad, pero se requiere más de una consulta para obtener toda la información.
    • Aunque las bases de datos NoSQL son flexibles a diferentes tipos de datos, casi todo su procesamiento se debe realizar por consola debido a que existen pocas herramientas y entornos de desarrollo amigables con el programador.
    • Las aplicaciones de las bases de datos en general, permiten facilitar verdaderamente el trabajo de los usuarios quiénes la usan, ya que se pueden estructurar búsquedas simples y complejas de la información que se requiere, y así, agilizar procesos y mejorar la eficiencia de trabajo.


    Referencia

    Mongo DB, “¿Qué es Mongo DB?.” https://www.mongodb.com/es/what-is-mongodb (acceso Febrero, 2022).

    Comentarios