Base de Datos • Personal

Diseño y estructura de la base de datos del subsistema de personal.

4 Tablas (1 Principal + 3 de Apoyo)
3 Relaciones 1:N
Normalizada (3NF)

Diagrama de la Base de Datos

Diagrama de la tabla en la base de datos — Personal

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

Id_personal: Clave primaria (PK) autoincremental única para cada empleado.
primer_nombre, ap_paterno, etc.: Campos para la identificación formal del empleado.
telefono, correo, etc.: Información de contacto. El correo es único si se especifica.
Id_rol: Clave foránea (FK) que se conecta con `PersonalRol` para definir sus permisos.
Id_estado: Clave foránea (FK) que se conecta con `PersonalEstado` para definir su estatus (ej. 'Activo').
Id_sexo: Clave foránea (FK) opcional que se conecta con la tabla compartida `Sexo`.

Tabla PersonalRol

Catálogo para estandarizar los roles. Evita errores y facilita la gestión de permisos.

Campos

Id_rol: Clave primaria (PK) para el rol.
nombre: Descripción del rol (ej. 'Administrador').

Tabla PersonalEstado

Catálogo para los estados del personal ('Activo', 'Inactivo'). Centraliza las opciones disponibles.

Campos

Id_estado: Clave primaria (PK) para el estado.
nombre: Descripción del estado (ej. 'Activo').

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

SQL Creación de tablas del módulo Personal
-- 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

SQL Inserción de registros 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