Base de Datos • Proveedores

Diseño y estructura de la base de datos del subsistema de proveedores

2 Tablas
Relación N:M
3 Tipos Entrega

Diagrama de la Base de Datos

Diagrama de la tabla en la base de datos — Proveedores

Arquitectura de la Base de Datos

El módulo se compone de tablas principales, tablas de subtipo y catálogos de apoyo para garantizar la normalización y flexibilidad.

Tabla Proveedor (Tabla Base)

Propósito

Almacenar la información común y compartida para todos los proveedores, como RFC, contacto y dirección. Actúa como la tabla padre para los distintos tipos de proveedor.

Campos Clave

Id_proveedor: PK única para cada proveedor.
Id_tipo_proveedor: FK que indica si es 'Persona Física' o 'Empresa'.
RFC: Identificador fiscal único y opcional.

Tabla ProveedorPersonaFisica

(Subtipo) Almacena datos exclusivos de proveedores que son personas físicas.

Campos

Id_proveedor: PK y FK que la conecta a la tabla `Proveedor`.
primer_nombre, ap_paterno: Nombre completo.

Tabla ProveedorPersonaMoral

(Subtipo) Almacena datos exclusivos de proveedores que son empresas.

Campos

Id_proveedor: PK y FK que la conecta a la tabla `Proveedor`.
razon_social: Nombre legal de la empresa.

Tabla ProveedorItem (Tabla de Unión)

Propósito

Gestionar la relación muchos-a-muchos (N:M) entre proveedores e ítems. Define qué producto ofrece cada proveedor y bajo qué condiciones comerciales.

Campos

Id_proveedor: Clave foránea (FK) que conecta con la tabla `Proveedor`.
Id_item: Clave foránea (FK) que conecta con la tabla `CatalogoItem`.
precio_unitario: Precio de compra específico que ofrece este proveedor por este ítem.
Id_tipo_entrega: FK que indica el método de entrega (ej. 'Local', 'Mensajería').
tiempo_entrega_dias: Días estimados que tarda el proveedor en surtir el ítem.
notas: Observaciones adicionales sobre la compra (ej. 'Compra mínima 5 pzs').

Catálogos de Apoyo y Tablas Geográficas

Estas tablas normalizan la información, evitan la redundancia y aseguran la consistencia de los datos en todo el módulo.

Tabla ProveedorTipo

Clasifica a los proveedores para distinguir entre 'Persona Física' y 'Empresa'.

Campos

Id_tipo_proveedor: PK
nombre: Descripción del tipo.

Tabla EntregaTipo

Estandariza los métodos de entrega disponibles (ej. 'Local', 'Mensajería').

Campos

Id_tipo_entrega: PK
nombre: Descripción del tipo.

Tabla Pais

Catálogo para almacenar los países.

Campos

Id_pais: PK
nombre: Nombre del país.

Tabla Estado

Catálogo para los estados, vinculados a un país.

Campos

Id_estado: PK
Id_pais: FK a la tabla `Pais`.

Tabla Municipio

Catálogo para los municipios, vinculados a un estado.

Campos

Id_municipio: PK
Id_estado: FK a la tabla `Estado`.

Normalización de la Base de Datos

1NF

Todos los atributos son atómicos y cada registro es único.

2NF

Se cumple al no tener dependencias parciales en tablas con claves compuestas como `ProveedorItem`.

3NF

Se eliminan dependencias transitivas al separar los datos de personas y empresas, y al usar catálogos (`ProveedorTipo`, `EntregaTipo`) para evitar redundancia.

Código SQL para Crear Tablas

SQL Creación de tablas del módulo Proveedores
-- Tablas de catálogo
CREATE TABLE dbo.ProveedorTipo (
    Id_tipo_proveedor TINYINT IDENTITY(1,1) PRIMARY KEY,
    nombre            NVARCHAR(50) NOT NULL UNIQUE
);
CREATE TABLE dbo.EntregaTipo (
    Id_tipo_entrega TINYINT IDENTITY(1,1) PRIMARY KEY,
    nombre          NVARCHAR(50) NOT NULL UNIQUE
);
GO
-- Tabla base
CREATE TABLE dbo.Proveedor (
    Id_proveedor        INT IDENTITY(1,1) PRIMARY KEY,
    Id_tipo_proveedor   TINYINT NOT NULL REFERENCES dbo.ProveedorTipo(Id_tipo_proveedor),
    RFC                 VARCHAR(13) NULL UNIQUE,
    telefono            VARCHAR(25) NULL,
    Id_municipio        INT NULL -- FK a tabla geográfica
);
GO
-- Tablas de subtipo
CREATE TABLE dbo.ProveedorPersonaFisica (
    Id_proveedor    INT PRIMARY KEY REFERENCES dbo.Proveedor(Id_proveedor) ON DELETE CASCADE,
    primer_nombre   NVARCHAR(60) NOT NULL,
    ap_paterno      NVARCHAR(60) NOT NULL
);
CREATE TABLE dbo.ProveedorPersonaMoral (
    Id_proveedor    INT PRIMARY KEY REFERENCES dbo.Proveedor(Id_proveedor) ON DELETE CASCADE,
    razon_social    NVARCHAR(200) NOT NULL
);
GO
-- Tabla de unión
CREATE TABLE dbo.ProveedorItem (
    Id_proveedor        INT NOT NULL REFERENCES dbo.Proveedor(Id_proveedor),
    Id_item             VARCHAR(20) NOT NULL REFERENCES dbo.CatalogoItem(Id_item),
    precio_unitario     DECIMAL(12,2) NOT NULL,
    Id_tipo_entrega     TINYINT NOT NULL REFERENCES dbo.EntregaTipo(Id_tipo_entrega),
    tiempo_entrega_dias INT NULL,
    PRIMARY KEY (Id_proveedor, Id_item)
);
GO