Este tutorial proporciona los pasos completos para diseñar un esquema de base de datos del Sistema de gestión de inventario para administrar los proveedores, los vendedores, los artículos, las existencias de artículos, las órdenes de compra y las órdenes de los clientes.
Notas :Por lo general, las empresas minoristas y manufactureras emplean sistemas de inventario. Entre los casos de uso generalizados en otras industrias, este esquema de base de datos se puede utilizar, por ejemplo, para la gestión de inventario hospitalario para aumentar la eficiencia de las cadenas de suministro de atención médica y reducir el desperdicio de medicamentos.
El Diagrama de Relación de Entidades o el diseño de la base de datos visual se muestra a continuación.
Base de datos de gestión de inventario
También puede visitar los tutoriales populares que incluyen Cómo instalar MySQL 8 en Ubuntu 20.04 LTS, Cómo instalar MySQL 8 en Windows, Cómo instalar MySQL Workbench en Ubuntu, Cómo instalar MySQL 8 con Workbench en Windows 10, Base de datos RBAC en MySql, Blog Database en MySql, Quiz Database en MySQL, Poll &Survey Database en MySQL, Online Shopping Cart Database en MySQL y Learn Basic SQL Queries In MySQL.
Base de datos de inventario
El primer paso es crear la base de datos de inventario. Se puede crear usando la consulta como se muestra a continuación.
CREATE SCHEMA `inventory` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
He usado el conjunto de caracteres utf8mb4 para admitir una amplia gama de caracteres.
Tabla de usuarios
En esta sección, diseñaremos la Tabla de usuarios para almacenar información del usuario. Los usuarios pueden administrar sus propios perfiles. Además, los usuarios pueden utilizar la aplicación según los roles que se les asignen. También puede consultar el tutorial Base de datos RBAC en MySql para implementar un sistema RBAC completo para administrar roles y permisos. A continuación se menciona la descripción de todas las columnas de la tabla de usuarios.
Id | La identificación única para identificar al usuario. |
Id. de función | El rol del usuario. Puede ser administrador, proveedor, vendedor y cliente. |
Nombre | El nombre del usuario. |
Segundo Nombre | El segundo nombre del usuario. |
Apellido | El apellido del usuario. |
Móvil | El número de móvil del usuario. Se puede utilizar con fines de inicio de sesión y registro. |
Correo electrónico | El correo electrónico del usuario. Se puede utilizar con fines de inicio de sesión y registro. |
Hash de contraseña | El hash de contraseña generado por el algoritmo apropiado. Debemos evitar almacenar contraseñas simples o encriptadas. |
Registrado en | Esta columna se puede utilizar para calcular la vida del usuario con la aplicación. |
Último inicio de sesión | Se puede utilizar para identificar el último inicio de sesión del usuario. |
Introducción | Una breve introducción del Usuario. |
Perfil | Detalles del usuario. |
La tabla de usuarios con las restricciones adecuadas se muestra a continuación.
CREATE TABLE `inventory`.`user` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`roleId` SMALLINT NOT NULL,
`firstName` VARCHAR(50) NULL DEFAULT NULL,
`middleName` VARCHAR(50) NULL DEFAULT NULL,
`lastName` VARCHAR(50) NULL DEFAULT NULL,
`username` VARCHAR(50) NULL DEFAULT NULL,
`mobile` VARCHAR(15) NULL,
`email` VARCHAR(50) NULL,
`passwordHash` VARCHAR(32) NOT NULL,
`registeredAt` DATETIME NOT NULL,
`lastLogin` DATETIME NULL DEFAULT NULL,
`intro` TINYTEXT NULL DEFAULT NULL,
`profile` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_username` (`username` ASC),
UNIQUE INDEX `uq_mobile` (`mobile` ASC),
UNIQUE INDEX `uq_email` (`email` ASC) );
Tabla de productos
En esta sección, diseñaremos la Tabla de productos para almacenar los datos del producto. A continuación se menciona la descripción de todas las columnas de la Tabla de productos.
Id | La identificación única para identificar el producto. |
Título | El título del producto que se mostrará en el Inventario. |
Resumen | El resumen para mencionar los aspectos más destacados. |
Tipo | El tipo para distinguir entre los diferentes tipos de productos. |
Creado en | Almacena la fecha y hora en que se crea el producto. |
Actualizado en | Almacena la fecha y hora en que se actualiza el producto. |
Contenido | La columna utilizada para almacenar los detalles adicionales del producto. |
La tabla de productos con las restricciones apropiadas se muestra a continuación.
CREATE TABLE `inventory`.`product` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(75) NOT NULL,
`summary` TINYTEXT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`)
);
Meta de producto
La metatabla de productos se puede utilizar para almacenar información adicional sobre productos, incluida la URL del banner del producto, etc. A continuación se menciona la descripción de todas las columnas de la metatabla de productos.
Id | La identificación única para identificar el meta del producto. |
Identificación del producto | La identificación del producto para identificar el producto principal. |
Clave | La clave que identifica el meta. |
Contenido | La columna utilizada para almacenar los metadatos del producto. |
La metatabla de productos con las restricciones adecuadas se muestra a continuación.
CREATE TABLE `inventory`.`product_meta` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`productId` BIGINT NOT NULL,
`key` VARCHAR(50) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_meta_product` (`productId` ASC),
UNIQUE INDEX `uq_product_meta` (`productId` ASC, `key` ASC),
CONSTRAINT `fk_meta_product`
FOREIGN KEY (`productId`)
REFERENCES `inventory`.`product` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Tabla de categorías y tabla de categorías de productos
En esta sección, diseñaremos la Tabla de categorías y Tabla de categorías de productos para almacenar las categorías de productos y sus asignaciones. A continuación se menciona la descripción de todas las columnas de la tabla de categorías.
Id | La identificación única para identificar la categoría. |
Id principal | La identificación principal para identificar la categoría principal. |
Título | El título de la categoría. |
Metatítulo | El metatítulo que se usará para el título del navegador y SEO. |
Babosa | El slug de categoría para formar la URL. |
Contenido | La columna utilizada para almacenar los detalles de la categoría. |
La tabla de categorías con las restricciones apropiadas se muestra a continuación.
CREATE TABLE `inventory`.`category` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`parentId` BIGINT NULL DEFAULT NULL,
`title` VARCHAR(75) NOT NULL,
`metaTitle` VARCHAR(100) NULL DEFAULT NULL,
`slug` VARCHAR(100) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`));
ALTER TABLE `inventory`.`category`
ADD INDEX `idx_category_parent` (`parentId` ASC);
ALTER TABLE `inventory`.`category`
ADD CONSTRAINT `fk_category_parent`
FOREIGN KEY (`parentId`)
REFERENCES `inventory`.`category` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
A continuación se menciona la descripción de todas las columnas de la tabla de categorías de productos.
Id. de producto | La identificación del producto para identificar el producto. |
ID de categoría | El ID de categoría para identificar la categoría. |
La tabla de categorías de productos con las restricciones correspondientes se muestra a continuación.
CREATE TABLE `inventory`.`product_category` (
`productId` BIGINT NOT NULL,
`categoryId` BIGINT NOT NULL,
PRIMARY KEY (`productId`, `categoryId`),
INDEX `idx_pc_category` (`categoryId` ASC),
INDEX `idx_pc_product` (`productId` ASC),
CONSTRAINT `fk_pc_product`
FOREIGN KEY (`productId`)
REFERENCES `inventory`.`product` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_pc_category`
FOREIGN KEY (`categoryId`)
REFERENCES `inventory`.`category` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
Tabla de marcas
En esta sección diseñaremos la Tabla de Marcas para almacenar los datos de la marca. A continuación se menciona la descripción de todas las columnas de la tabla de marcas.
Id | La identificación única para identificar la marca. |
Título | El título de la marca que se mostrará en el Inventario. |
Resumen | El resumen menciona los aspectos más destacados. |
Creado en | Almacena la fecha y hora en que se crea el producto. |
Actualizado en | Almacena la fecha y hora en que se actualiza el producto. |
Contenido | La columna utilizada para almacenar los detalles adicionales de la marca. |
A continuación se muestra la tabla de marcas con las restricciones correspondientes.
CREATE TABLE `inventory`.`brand` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(75) NOT NULL,
`summary` TINYTEXT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`)
);
Tabla de pedidos Tabla
Esta sección proporciona la tabla para administrar las órdenes de inventario. El pedido se puede asociar con el Proveedor o el Cliente. A continuación se menciona la descripción de todas las columnas de la tabla de pedidos.
Id | La identificación única para identificar el pedido. |
ID de usuario | El id de usuario para identificar al Proveedor o Cliente asociado al pedido. |
Tipo | El tipo de orden para distinguir entre Orden de Compra u Orden de Cliente. |
Estado | El estado del pedido puede ser Nuevo, Finalizado, Pagado, Fallido, Enviado, Entregado, Devuelto y Completo. |
Subtotal | El precio total de los Artículos del Pedido. |
Descuento de artículo | El descuento total de los Artículos del Pedido. |
Impuestos | El impuesto sobre los Artículos del Pedido. |
Envío | Los gastos de envío de los Artículos del Pedido. |
Total | El precio total del Pedido, incluidos impuestos y gastos de envío. Excluye el descuento de artículos. |
Promoción | El código de promoción del Pedido. |
Descuento | El descuento total del Pedido basado en el código de promoción o descuento de la tienda. |
Total general | El total general del pedido a pagar por el comprador. |
Creado en | Almacena la fecha y hora en que se crea el pedido. |
Actualizado en | Almacena la fecha y hora en que se actualiza el pedido. |
Contenido | La columna utilizada para almacenar los detalles adicionales del pedido. |
La tabla de pedidos con las restricciones apropiadas se muestra a continuación.
CREATE TABLE `inventory`.`order` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`status` SMALLINT(6) NOT NULL DEFAULT 0,
`subTotal` FLOAT NOT NULL DEFAULT 0,
`itemDiscount` FLOAT NOT NULL DEFAULT 0,
`tax` FLOAT NOT NULL DEFAULT 0,
`shipping` FLOAT NOT NULL DEFAULT 0,
`total` FLOAT NOT NULL DEFAULT 0,
`promo` VARCHAR(50) NULL DEFAULT NULL,
`discount` FLOAT NOT NULL DEFAULT 0,
`grandTotal` FLOAT NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_order_user` (`userId` ASC),
CONSTRAINT `fk_order_user`
FOREIGN KEY (`userId`)
REFERENCES `inventory`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
Tabla de direcciones
En esta sección se proporciona la tabla para gestionar la dirección del usuario o del pedido. La dirección de usuario se puede utilizar para almacenar la dirección asociada con el usuario. La dirección del pedido se puede utilizar para almacenar la dirección de entrega de los pedidos de entrega a domicilio. A continuación se menciona la descripción de todas las columnas de la tabla de direcciones.
Id | La identificación única para identificar la dirección. |
ID de usuario | El ID de usuario para identificar al usuario asociado con la dirección. |
Id. de pedido | El ID del pedido para identificar el pedido asociado con la dirección. |
Nombre | El nombre del usuario. |
Segundo Nombre | El segundo nombre del usuario. |
Apellido | El apellido del usuario. |
Móvil | El número de móvil del usuario. |
Correo electrónico | El correo electrónico del usuario. |
Línea 1 | La primera línea para almacenar la dirección. |
Línea 2 | La segunda línea para almacenar la dirección. |
Ciudad | La ciudad de la dirección. |
Provincia | La provincia de la dirección. |
País | El país de la dirección. |
Creado en | Almacena la fecha y hora en que se crea el pedido. |
Actualizado en | Almacena la fecha y hora en que se actualiza el pedido. |
La tabla de direcciones con las restricciones adecuadas se muestra a continuación.
CREATE TABLE `inventory`.`address` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NULL DEFAULT NULL,
`orderId` BIGINT NULL DEFAULT NULL,
`firstName` VARCHAR(50) NULL DEFAULT NULL,
`middleName` VARCHAR(50) NULL DEFAULT NULL,
`lastName` VARCHAR(50) NULL DEFAULT NULL,
`mobile` VARCHAR(15) NULL,
`email` VARCHAR(50) NULL,
`line1` VARCHAR(50) NULL DEFAULT NULL,
`line2` VARCHAR(50) NULL DEFAULT NULL,
`city` VARCHAR(50) NULL DEFAULT NULL,
`province` VARCHAR(50) NULL DEFAULT NULL,
`country` VARCHAR(50) NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_address_user` (`userId` ASC),
CONSTRAINT `fk_address_user`
FOREIGN KEY (`userId`)
REFERENCES `inventory`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `inventory`.`address`
ADD INDEX `idx_address_order` (`orderId` ASC);
ALTER TABLE `inventory`.`address`
ADD CONSTRAINT `fk_address_order`
FOREIGN KEY (`orderId`)
REFERENCES `inventory`.`order` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Tabla de elementos
En esta sección, diseñaremos el Artículo Mesa para almacenar los detalles del artículo. El artículo representa los artículos almacenados en el inventario y comprados a los proveedores. A continuación se menciona la descripción de todas las columnas de la tabla de artículos.
Id | La identificación única para identificar el artículo. |
Identificación del producto | La identificación del producto para identificar el producto asociado con el artículo del inventario. |
Id. de marca | La identificación de la marca para identificar la marca asociada con el artículo del inventario. |
Id del proveedor | La identificación del proveedor para identificar al proveedor asociado con el artículo del inventario. |
Id. de pedido | La identificación del pedido para identificar el pedido asociado con el artículo del inventario. |
Creado por | La identificación de usuario para identificar al usuario que agregó el elemento de inventario. |
Actualizado por | La identificación de usuario para identificar al usuario que actualizó el elemento del inventario. |
Unidad de mantenimiento de existencias | El id para identificar el artículo en stock. |
Precio de venta máximo | El precio impreso del producto asociado con el artículo. |
Descuento | El descuento lo da el proveedor. |
Precio | El precio al que se compró el producto. |
Cantidad | La cantidad total recibida en el inventario. |
Vendido | La cantidad total vendida a los clientes. |
Disponible | La cantidad que está disponible en stock. |
Defectuoso | El total de artículos defectuosos recibidos en el inventario o devueltos por los clientes. |
Creado en | Almacena la fecha y hora en que se crea el pedido. |
Actualizado en | Almacena la fecha y hora en que se actualiza el pedido. |
La tabla de artículos con las restricciones apropiadas se muestra a continuación.
CREATE TABLE `inventory`.`item` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`productId` BIGINT NOT NULL,
`brandId` BIGINT NOT NULL,
`supplierId` BIGINT NOT NULL,
`orderId` BIGINT NOT NULL,
`sku` VARCHAR(100) NOT NULL,
`mrp` FLOAT NOT NULL DEFAULT 0,
`discount` FLOAT NOT NULL DEFAULT 0,
`price` FLOAT NOT NULL DEFAULT 0,
`quantity` SMALLINT(6) NOT NULL DEFAULT 0,
`sold` SMALLINT(6) NOT NULL DEFAULT 0,
`available` SMALLINT(6) NOT NULL DEFAULT 0,
`defective` SMALLINT(6) NOT NULL DEFAULT 0,
`createdBy` BIGINT NOT NULL,
`updatedBy` BIGINT DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_item_product` (`productId` ASC),
CONSTRAINT `fk_item_product`
FOREIGN KEY (`productId`)
REFERENCES `inventory`.`product` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `inventory`.`item`
ADD INDEX `idx_item_brand` (`brandId` ASC);
ALTER TABLE `inventory`.`item`
ADD CONSTRAINT `fk_item_brand`
FOREIGN KEY (`brandId`)
REFERENCES `inventory`.`brand` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `inventory`.`item`
ADD INDEX `idx_item_user` (`supplierId` ASC);
ALTER TABLE `inventory`.`item`
ADD CONSTRAINT `fk_item_user`
FOREIGN KEY (`supplierId`)
REFERENCES `inventory`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `inventory`.`item`
ADD INDEX `idx_item_order` (`orderId` ASC);
ALTER TABLE `inventory`.`item`
ADD CONSTRAINT `fk_item_order`
FOREIGN KEY (`orderId`)
REFERENCES `inventory`.`order` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Tabla de artículos de pedido
Esta sección proporciona la tabla para administrar los artículos de pedido comprados por los clientes. A continuación se menciona la descripción de todas las columnas de la tabla de artículos de pedido.
Id | La identificación única para identificar el artículo pedido. |
Identificación del producto | La identificación del producto para identificar el producto asociado con el artículo pedido. |
Id. del artículo | El id del artículo para identificar el artículo asociado con el artículo pedido. |
Id. de pedido | La identificación del pedido para identificar el pedido asociado con el artículo pedido. |
SKU | El SKU del producto al comprarlo. |
Precio | El precio del producto al comprarlo. |
Descuento | El descuento del producto al comprarlo. |
Cantidad | La cantidad del producto seleccionado por el usuario. |
Creado en | Almacena la fecha y hora en que se crea el artículo pedido. |
Actualizado en | Almacena la fecha y hora en que se actualiza el artículo pedido. |
Contenido | La columna utilizada para almacenar los detalles adicionales del artículo pedido. |
La tabla de artículos de pedido con las restricciones adecuadas se muestra a continuación.
CREATE TABLE `inventory`.`order_item` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`productId` BIGINT NOT NULL,
`itemId` BIGINT NOT NULL,
`orderId` BIGINT NOT NULL,
`sku` VARCHAR(100) NOT NULL,
`price` FLOAT NOT NULL DEFAULT 0,
`discount` FLOAT NOT NULL DEFAULT 0,
`quantity` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_order_item_product` (`productId` ASC),
CONSTRAINT `fk_order_item_product`
FOREIGN KEY (`productId`)
REFERENCES `inventory`.`product` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `inventory`.`order_item`
ADD INDEX `idx_order_item_item` (`itemId` ASC);
ALTER TABLE `inventory`.`order_item`
ADD CONSTRAINT `fk_order_item_item`
FOREIGN KEY (`itemId`)
REFERENCES `inventory`.`item` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `inventory`.`order_item`
ADD INDEX `idx_order_item_order` (`orderId` ASC);
ALTER TABLE `inventory`.`order_item`
ADD CONSTRAINT `fk_order_item_order`
FOREIGN KEY (`orderId`)
REFERENCES `inventory`.`order` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Tabla de transacciones
También necesitamos una tabla de transacciones para realizar un seguimiento de los pagos de pedidos realizados por el comprador y para la contabilidad. También podemos utilizar la misma tabla para registrar la devolución parcial o total del pedido. A continuación se menciona la descripción de todas las columnas de la tabla de transacciones.
Id | La identificación única para identificar la transacción. |
ID de usuario | El ID de usuario para identificar al usuario asociado con la transacción. |
Id. de pedido | La identificación del pedido para identificar el pedido asociado con la transacción. |
Código | La identificación de pago proporcionada por la pasarela de pago. |
Tipo | El tipo de transacción del pedido puede ser Crédito o Débito. |
Modo | El modo de transacción del pedido puede ser Fuera de línea, Contra reembolso, Cheque, Borrador, Alámbrico y En línea. |
Estado | El estado de la transacción del pedido puede ser Nuevo, Cancelado, Fallido, Pendiente, Rechazado, Rechazado y Correcto. |
Creado en | Almacena la fecha y hora en que se crea la transacción del pedido. |
Actualizado en | Almacena la fecha y hora en que se actualiza la transacción del pedido. |
Contenido | La columna utilizada para almacenar los detalles adicionales de la transacción. |
La tabla de transacciones con las restricciones apropiadas se muestra a continuación.
CREATE TABLE `inventory`.`transaction` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`orderId` BIGINT NOT NULL,
`code` VARCHAR(100) NOT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`mode` SMALLINT(6) NOT NULL DEFAULT 0,
`status` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_transaction_user` (`userId` ASC),
CONSTRAINT `fk_transaction_user`
FOREIGN KEY (`userId`)
REFERENCES `inventory`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `inventory`.`transaction`
ADD INDEX `idx_transaction_order` (`orderId` ASC);
ALTER TABLE `inventory`.`transaction`
ADD CONSTRAINT `fk_transaction_order`
FOREIGN KEY (`orderId`)
REFERENCES `inventory`.`order` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Resumen
En este tutorial, hemos discutido el diseño de la base de datos de un Sistema de gestión de inventario para almacenar los usuarios y administrar el inventario de productos. También proporcionó el diseño de la base de datos para gestionar las órdenes de compra y los pedidos de los clientes.
Puede enviar sus comentarios para unirse a la discusión. También te puede interesar diseñar la base de datos de las aplicaciones Blog y Poll &Survey. El esquema completo de la base de datos también está disponible en GitHub.