Diagrama de la Base de Datos

Arquitectura de la Base de Datos
Tabla Personal
Propósito
Almacenar el registro central de cada empleado, vinculando su información personal con roles y estados estandarizados para un control de acceso robusto y una gestión de RRHH consistente.
Campos
Tabla PersonalRol
Catálogo para estandarizar los roles. Evita errores y facilita la gestión de permisos.
Campos
Tabla PersonalEstado
Catálogo para los estados del personal ('Activo', 'Inactivo'). Centraliza las opciones disponibles.
Campos
Normalización de la Base de Datos
1NF
Datos atómicos por empleado; cada celda contiene un solo valor.
2NF
Todos los atributos dependen directamente de la clave primaria `Id_personal`.
3NF
Al separar Roles y Estados en tablas de catálogo, se eliminan dependencias transitivas y se previene la redundancia de datos.
Código SQL para Crear Tablas
-- Tablas de apoyo para normalizar
CREATE TABLE dbo.PersonalRol (
Id_rol TINYINT IDENTITY(1,1) PRIMARY KEY,
nombre NVARCHAR(50) NOT NULL UNIQUE
);
CREATE TABLE dbo.PersonalEstado (
Id_estado TINYINT IDENTITY(1,1) PRIMARY KEY,
nombre NVARCHAR(50) NOT NULL UNIQUE
);
GO
-- Tabla principal de Personal
CREATE TABLE dbo.Personal (
Id_personal INT IDENTITY(1,1) PRIMARY KEY,
primer_nombre NVARCHAR(60) NOT NULL,
segundo_nombre NVARCHAR(60) NULL,
ap_paterno NVARCHAR(60) NOT NULL,
ap_materno NVARCHAR(60) NULL,
telefono VARCHAR(25) NULL,
direccion NVARCHAR(250) NULL,
correo NVARCHAR(120) NULL,
Id_sexo TINYINT NULL REFERENCES dbo.Sexo(Id_sexo),
fecha_nac DATE NULL,
Id_rol TINYINT NOT NULL REFERENCES dbo.PersonalRol(Id_rol),
Id_estado TINYINT NOT NULL REFERENCES dbo.PersonalEstado(Id_estado)
);
GO
-- Índice único filtrado para correos no nulos
CREATE UNIQUE INDEX UQ_Personal_correo ON dbo.Personal(correo) WHERE correo IS NOT NULL;
GO
Datos de Ejemplo
-- Poblar catálogos primero
INSERT INTO dbo.PersonalRol (nombre) VALUES ('Administrador'), ('Técnico'), ('Cajero');
INSERT INTO dbo.PersonalEstado (nombre) VALUES ('Activo'), ('Inactivo');
GO
-- Insertar personal usando los IDs de los catálogos
INSERT INTO dbo.Personal (primer_nombre, ap_paterno, telefono, correo, Id_rol, Id_estado)
VALUES
('José','Cortés','555-000-1111','jose.taller@example.com', 1, 1),
('Ana','Ramírez','555-000-2222','ana.tecnica@example.com', 2, 1),
('Luis','Mora','555-000-3333','luis.caja@example.com', 3, 1);
GO