Bases de datos modernas

Generando la estructura de tablas desde un .json

La idea original era ampliar esta entrada, pero para el segundo reto del Backend de la Suerte 2023 tuve que realizar algunas cosas adicionales y al final decidí crear una nueva entrada para esta mini saga.

Ampliando la base de datos

Para cumplir el requerimiento cree varias tablas, al igual que la primera vez, lo hice desde la web de Xata. El editor es sencillo pero suficiente para lo que necesito.

esquema de la base de datos

Para manejar las ordenes tal cual se especifica en el README del reto, me pareció conveniente utilizar el concepto de objeto dentro de una tabla. Lo intente desde el editor web pero no me funcionó (luego encontré el por qué en la documentación*) así que opte por cargar el schema desde un .json 😵

*While the API supports the object type, the Web UI and CLI do not expose it as an option yet. There is still work in progress.

Lo primero fue instalar el cliente de xata, seguir los pasos para autenticarlo con la cuenta y ejecutar los comandos deseados. Para no perder la definición de las tablas creadas, primero un dump, agregar la definición de la tabla ordenes y luego un upload.

xata schema dump
xata shema upload C:\coding\xata\CocinaZombie.json

Acá el schema completo

{

  "tables": [
    {
      "name": "comanda",
      "columns": [
        {
          "name": "FechaHora",
          "type": "datetime",
          "defaultValue": "2023-03-09T12:00:00Z"
        }
      ]
    },
    {
      "name": "cocina",
      "columns": [
        {
          "name": "Limite",
          "type": "int",
          "defaultValue": "0"
        }
      ]
    },
    {
      "name": "menu",
      "columns": [
        {
          "name": "nombre",
          "type": "string"
        },
        {
          "name": "detalle",
          "type": "text"
        },
        {
          "name": "especial",
          "type": "bool"
        }
      ]
    },

    {
      "name": "order",
      "columns": [
        {
          "name": "table",
          "type": "int"
        },
        {
          "name": "createdAt",
          "type": "datetime"
        },
        {
          "name": "dishes",
          "type": "object",
          "columns": [
            {
              "name": "name",
              "type": "string"
            },
            {
              "name": "quantity",
              "type": "int"
            }
          ]
        }
      ]
    }
  ]
}

Primera vez que trabajo con una base de datos en esta modalidad, me parece casi magia y sobre todo al leer un poco más la documentación, se me ocurren varias cosas que podría hacer con la posibilidad de crear nuevas columnas en una tabla utilizando el API REST 🤯

Querys con APIs

Primero, unas pruebas con Insomnia para tener claro los endpoints y métodos. Ahí me di cuenta que definir dishes como objeto no me sirve, ya que solo permite un elemento. Entonces veo dos opciones:

  • Utilizar un campo texto y almacenar la colección de platos en formato json

  • Crear una tabla subordinada

En un desarrollo de los que estoy acostumbrado me iría por la segunda opción sin pensarlo, pero como la idea del reto es probar cosas nuevas me decidí por la primera.

Así que eliminé las dos columnas dishes.name y dishes.quantity, y las reemplacé por un campo texto dishes.

Un poco de LowCode

Ya con las tablas listas, hay que utilizarlas en la aplicación. Primero pensé en modificar el mismo web panel del reto 1 (ver acá), pero al final terminé creando uno nuevo con:

  • un botón para crear nueva orden

  • una grilla con el listado de las órdenes creadas

  • un popup para ver el menú y crear la orden

El resultado se lo puede ver aquí.

Un detalle que descubrí al hacer el deploy, es que si se hace el push desde línea de comandos a un repositorio que no existe da error, pero si se lo hace desde Docker Desktop se crea el repositorio. Acá el repositorio con las imágenes.

Nota de color, el menú 'zombie' es una muestra de la gastronomía ecuatoriana 😁

listado de platos típicos de la cocina ecuatoriana