Base de datos - puj-course/FIS_2630_1204_G2 GitHub Wiki

Base de datos

El esquema está compuesto por 25 tablas en PostgreSQL 16. La definición de cada una vive en db/ddl/, un archivo por tabla, y el README de esa carpeta tiene el detalle completo: columnas, restricciones y orden de instalación.

Esta página explica cómo está modelado y por qué.

Cómo está organizado

Catálogos. Tablas pequeñas de valores fijos: roles, tipos_documento, zonas, estados_mesa, unidades_medida, categorias. Casi todo lo demás depende de ellas, por eso se crean primero.

Maestras. Lo que el restaurante administra: usuarios, clientes, mesas, ingredientes, productos, precios_producto.

Transaccionales. Lo que ocurre durante la operación: pedidos, detalle_pedido, pagos, movimientos_inventario, reservas, nota_mesa, historial_estado_mesa, alerta_inventario.

Decisiones de modelado

Los estados son texto en mayúsculas, no números. estado = 'AGOTADO' se entiende leyendo una consulta; estado = 3 no. En las tablas donde el conjunto de valores es cerrado y pequeño se usa una restricción CHECK; donde puede crecer, una tabla de catálogo.

El precio de venta se congela en el momento del pedido. detalle_pedido guarda su propio precio_unitario en lugar de consultar productos. Si mañana sube el plato, la factura de ayer no cambia.

Los totales se validan en la base. pagos tiene una restricción que exige que el total pagado corresponda con la suma de sus componentes. Una columna calculada que nadie verifica es una columna que tarde o temprano queda descuadrada.

Las cantidades de inventario usan cuatro decimales. Un ingrediente puede consumirse en gramos o en fracciones de litro, así que NUMERIC(12,4) en stock y en movimientos. El dinero usa dos: NUMERIC(12,2).

Convenciones

  • Llaves primarias: BIGINT GENERATED BY DEFAULT AS IDENTITY
  • Restricciones: prefijos pk_, uq_, fk_, ck_
  • Índices: prefijo ix_
  • Auditoría: fecha_creacion y fecha_actualizacion en las tablas maestras

Hay dos convenciones conviviendo en el esquema, heredadas de módulos distintos: algunas tablas nombran su llave id_mesa y otras producto_id; algunas usan uq_ y otras uk_. Está registrado como pendiente.