🧩 Introducción
Cuando hablamos de desarrollar una base de datos, la clave está en planificar antes de escribir una sola línea de código. Así como un artista necesita un lienzo antes de pintar, nosotros necesitamos un Diagrama de Entidad-Relación para visualizar y estructurar nuestro sistema de información.
En esta guía, te mostraré cómo crear una base de datos funcional para un restaurante, paso a paso, utilizando SQL Server. Este proceso es aplicable a cualquier negocio que desees modelar, ya sea una papelería, una tienda de abarrotes, o cualquier otro tipo de establecimiento.
🗂️ Paso 1: Identificar los Objetos de la Entidad (Tablas)
Para comenzar, debemos preguntarnos: ¿Qué necesita un restaurante para funcionar? A partir de esta pregunta, identificamos las entidades principales que se convertirán en nuestras tablas:
1. Clientes
Los clientes son la razón de ser del negocio. Son las personas que vienen a disfrutar de la experiencia gastronómica con amigos o familiares.
2. Empleados
Meseros, cocineros, cajeros, lavaplatos... todos ellos forman parte del equipo que hace posible la operación y brinda servicio al cliente.
3. Mesas
Bonitas, elegantes y bien ubicadas. Las mesas son el espacio físico donde los clientes disfrutarán sus alimentos y bebidas.
4. Productos (Platillos y Bebidas)
El plato principal de nuestro sistema: los alimentos y bebidas que los clientes van a degustar. Se organizan por categorías como entradas, platos fuertes, bebidas y postres.
5. Inventario/Insumos
Todo negocio necesita llevar control de sus insumos. Esta tabla nos permitirá gestionar el stock de ingredientes necesarios para preparar nuestros platillos.
6. Proveedores
Los socios estratégicos que proporcionan los mejores productos al mejor precio.
7. Reservaciones
Permiten a los clientes asegurar su lugar sin tener que hacer fila de espera. Aquí gestionamos el estado de cada reserva.
8. Órdenes
Registra las transacciones principales cuando los clientes deciden comenzar a degustar.
9. Detalle de Órdenes
El proceso de pedido es dinámico: los clientes pueden agregar más platillos durante la comida. Esta tabla almacena cada línea de detalle hasta que se cierra la cuenta.
Paso 2: Diagrama de Entidad-Relación (DER)
Una vez identificados los objetos, es momento de dibujar nuestro lienzo. El Diagrama de Entidad-Relación nos permite visualizar:
- Entidades (tablas)
- Atributos (columnas)
- Relaciones (llaves foráneas)
Estructura de Tablas
Entonces, con base en estos objetos, podemos definir nuestras tablas de la siguiente manera:
Cliente
| Campo | Tipo | Descripción |
|---|---|---|
| ClienteID | INT (PK) | Identificador único del cliente |
| Nombre | NVARCHAR(100) | Nombre completo del cliente |
| Teléfono | NVARCHAR(20) | Número de contacto |
| Correo | NVARCHAR(100) | Correo electrónico |
| Dirección | NVARCHAR(200) | Dirección física |
Empleado
| Campo | Tipo | Descripción |
|---|---|---|
| EmpleadoID | INT (PK) | Identificador único del empleado |
| Nombre | NVARCHAR(100) | Nombre completo del empleado |
| Rol | NVARCHAR(50) | Mesero, cocinero, cajero, etc. |
| Teléfono | NVARCHAR(20) | Número de contacto |
| FechaContratación | DATE | Fecha de ingreso del empleado |
Mesa
| Campo | Tipo | Descripción |
|---|---|---|
| MesaID | INT (PK) | Identificador único de la mesa |
| Número | INT | Número de mesa |
| Capacidad | INT | Número máximo de ocupantes |
| Ubicación | NVARCHAR(100) | Área del restaurante |
Producto
| Campo | Tipo | Descripción |
|---|---|---|
| ProductoID | INT (PK) | Identificador único del producto |
| Nombre | NVARCHAR(100) | Nombre del platillo o bebida |
| Descripción | NVARCHAR(200) | Detalles del producto |
| Precio | DECIMAL(10,2) | Precio unitario |
| Categoría | NVARCHAR(50) | Entrada, plato fuerte, bebida, postre |
Proveedor
| Campo | Tipo | Descripción |
|---|---|---|
| ProveedorID | INT (PK) | Identificador único del proveedor |
| Nombre | NVARCHAR(100) | Razón social |
| Teléfono | NVARCHAR(20) | Número de contacto |
| Correo | NVARCHAR(100) | Correo electrónico |
| Dirección | NVARCHAR(200) | Dirección física |
Inventario
| Campo | Tipo | Descripción |
|---|---|---|
| InventarioID | INT (PK) | Identificador único del registro |
| ProductoID | INT (FK) | Referencia al producto |
| ProveedorID | INT (FK) | Referencia al proveedor |
| CantidadDisponible | INT | Stock actual |
| UltimaActualizacion | DATETIME | Fecha del último cambio |
Reservación
| Campo | Tipo | Descripción |
|---|---|---|
| ReservacionID | INT (PK) | Identificador único |
| FechaHora | DATETIME | Fecha y hora de la reserva |
| ClienteID | INT (FK) | Referencia al cliente |
| MesaID | INT (FK) | Referencia a la mesa |
| CantidadPersonas | INT | Número de comensales |
| Estado | NVARCHAR(50) | Pendiente, confirmada, cancelada |
Orden
| Campo | Tipo | Descripción |
|---|---|---|
| OrdenID | INT (PK) | Identificador único |
| FechaHora | DATETIME | Fecha y hora de la orden |
| ClienteID | INT (FK) | Referencia al cliente |
| MesaID | INT (FK) | Referencia a la mesa |
| EmpleadoID | INT (FK) | Referencia al empleado que atiende |
| Total | DECIMAL(10,2) | Monto total de la orden |
DetalleOrden
| Campo | Tipo | Descripción |
|---|---|---|
| DetalleID | INT (PK) | Identificador único |
| OrdenID | INT (FK) | Referencia a la orden |
| ProductoID | INT (FK) | Referencia al producto |
| Cantidad | INT | Cantidad de unidades |
| PrecioUnitario | DECIMAL (10,2) | Precio al momento de la orden |
| Subtotal | DECIMAL(10,2) | Cálculo automático (Cantidad x PrecioUnitario) |
Finalmente, así es como queda nuestro diagrama de Entidad Relación:
Paso 3: Creación de la Base de Datos en MSSQL Server
Ahora pasamos a la parte técnica. Abrimos una nueva consulta en SQL Server Management Studio y comenzamos a escribir nuestro script usando T-SQL.
1.- Creación de la Base de Datos
Aquí les comparto 2 formas de hacerlo...
- Script Simple:
CREATE DATABASE Restaurant_BD;
- Script con Parámetros:
-- Crear base de datos CREATE DATABASE Restaurant_BD ON ( Name = RestaurantDB_dat, Filename = 'E:\sql\DATA\RestaurantDB.mdf', Size = 10, MaxSize = 1024, FileGrowth = 5 ) LOG ON ( Name = RestaurantDB_log, Filename = 'E:\sql\LOGS\RestaurantDB.ldf', Size = 5MB, MaxSize = 100MB, FileGrowth = 5MB ); GO -- Indicamos al Manejador de Base de Datos que ahora utilice la nueva Base de Datos USE Restaurant_BD; GO - Primero crea a base de datos Restaurant_BD
- Luego especifica los archivos físicos que la forman:
- Archivo de datos RestaurantBD.mdf con un tamaño inicial de 10 MB
- Archivo de log RestaurantBD.ldf con un tamaño inicial de 5 MB
¿Qué hace este script con parámetros?
2.- Creación de las tablas
Siguiendo las definiciones mostradas anteriormente, podemos crear los scripts para cada tabla de la siguiente manera:
- Cliente
CREATE TABLE Cliente ( ClienteID INT PRIMARY KEY IDENTITY, Nombre NVARCHAR(100), Telefono NVARCHAR(20), Correo NVARCHAR(100), Direccion NVARCHAR(200) ); - Mesa
CREATE TABLE Mesa ( MesaID INT PRIMARY KEY IDENTITY, Numero INT, Capacidad INT, Ubicacion NVARCHAR(100) ); - Empleado
CREATE TABLE Empleado ( EmpleadoID INT PRIMARY KEY IDENTITY, Nombre NVARCHAR(100), Rol NVARCHAR(50), Telefono NVARCHAR(20), FechaContratacion DATE ); - Producto
CREATE TABLE Producto ( ProductoID INT PRIMARY KEY IDENTITY, Nombre NVARCHAR(100), Descripcion NVARCHAR(200), Precio DECIMAL(10,2), Categoria NVARCHAR(50) ); - Proveedor
CREATE TABLE Proveedor ( ProveedorID INT PRIMARY KEY IDENTITY, Nombre NVARCHAR(100), Telefono NVARCHAR(20), Correo NVARCHAR(100), Direccion NVARCHAR(200) ); - Orden
CREATE TABLE Orden ( OrdenID INT PRIMARY KEY IDENTITY, FechaHora DATETIME, ClienteID INT FOREIGN KEY REFERENCES Cliente(ClienteID), MesaID INT FOREIGN KEY REFERENCES Mesa(MesaID), EmpleadoID INT FOREIGN KEY REFERENCES Empleado(EmpleadoID), Total DECIMAL(10,2) ); - DetalleOrden
CREATE TABLE DetalleOrden ( DetalleID INT PRIMARY KEY IDENTITY, OrdenID INT FOREIGN KEY REFERENCES Orden(OrdenID), ProductoID INT FOREIGN KEY REFERENCES Producto(ProductoID), Cantidad INT, PrecioUnitario DECIMAL(10,2), Subtotal AS (Cantidad * PrecioUnitario) PERSISTED );Nota: Subtotal es una columna calculada que se genera automáticamente.
- Reservacion
CREATE TABLE Reservacion ( ReservacionID INT PRIMARY KEY IDENTITY, FechaHora DATETIME, ClienteID INT FOREIGN KEY REFERENCES Cliente(ClienteID), MesaID INT FOREIGN KEY REFERENCES Mesa(MesaID), CantidadPersonas INT, Estado NVARCHAR(50) ); - Inventario
CREATE TABLE Inventario ( InventarioID INT PRIMARY KEY IDENTITY, ProductoID INT FOREIGN KEY REFERENCES Producto(ProductoID), ProveedorID INT FOREIGN KEY REFERENCES Proveedor(ProveedorID), CantidadDisponible INT, UltimaActualizacion DATETIME );
Paso 4: Relaciones entre Tablas
Una base de datos relacional se caracteriza por las conexiones entre sus tablas. Aquí un resumen de las relaciones implementadas:
| Tabla | Llave Foránea | Tabla Referenciada |
|---|---|---|
| Orden | ClienteID | Cliente |
| Orden | MesaID | Mesa |
| Orden | EmpleadoID | Empleado |
| DetalleOrden | OrdenID | Orden |
| DetalleOrden | ProductoID | Producto |
| Reservacion | ClienteID | Cliente |
| Reservacion | MesaID | Mesa |
| Inventario | ProcutoID | Producto |
| Inventario | ProveedorID | Proveedor |
Conceptos Fundamentales Aplicados
¿Qué es una Llave Primaria (PK)?
Es el identificador único de cada registro en una tabla. En nuestro diseño, usamos IDENTITY para que SQL Server genere automáticamente valores secuenciales.
¿Qué es una Llave Foránea (FK)?
Es un campo que establece una relación entre dos tablas. Por ejemplo, Orden.ClienteID referencia a Cliente.ClienteID, conectando una orden con su cliente correspondiente.
Columnas Calculadas
DetalleOrden.Subtotal es una columna calculada que automáticamente multiplica Cantidad × PrecioUnitario, evitando cálculos manuales y reduciendo errores.
Tipos de Datos Comunes
- INT: Números enteros.
- NVARCHAR(n): Texto variable con soporte Unicode
- DECIMAL(p,s): Números decimales con precisión definida
- DATETIME: Fecha y hora
- DATE: Solo fecha
Consejos para Extender tu Base de Datos
La belleza del diseño de bases de datos es que puede ser tan simple o complejo como el proyecto lo requiera. Aquí algunas ideas para expandirla:
- Agregar más categorías de productos
- Implementar un sistema de promociones y descuentos
- Gestionar turnos y horarios de empleados
- Registrar pagos y métodos de pago
- Añadir control de costos y márgenes de ganancia
Conclusión
En unos cuantos pasos hemos construido una base de datos funcional para un restaurante desde cero. Lo importante es que el diseño sea coherente, útil y escalable. Este mismo enfoque puede aplicarse a cualquier tipo de negocio: papelerías, tiendas de abarrotes, clínicas, etc.
Principios Clave para Recordar:
- Planifica antes de programar: El Diagrama Entidad-Relación es tu lienzo.
- Identifica todas las entidades que interactúan en tu negocio.
- Define relaciones claras entre tus tablas.
- Elige tipos de datos adecuados para cada campo.
- Considera el crecimiento futuro al diseñar tu estructura.
La teoría te da fundamentos sólidos que, si dominas, te permitirán generar scripts y código de manera fácil y eficiente. No subestimes el valor de aprender los conceptos básicos; ellos son los cimientos de todo buen desarrollador.