Este tutorial proporciona pasos completos para diseñar un esquema de base de datos de tiendas en línea y carritos de compras para administrar usuarios, productos, reseñas, carritos, pedidos y pagos. Se puede utilizar además para desarrollar una tienda en línea y sitios web o aplicaciones basados en carritos de compras.
El Diagrama de Relación de Entidades o el diseño de la base de datos visual se muestra a continuación.
Carro de compras en línea
Notas :permite que los pedidos de invitados realicen el pedido sin iniciar sesión. La seguridad se puede manejar siguiendo la base de datos RBAC en MySql.
También puede visitar los tutoriales populares que incluyen Cómo instalar MySQL 8 en Ubuntu, Cómo instalar MySQL 8 en Windows, Cómo instalar MySQL 8 con Workbench en Windows 10, Base de datos RBAC en MySql, Base de datos de blogs en MySql, Base de datos de cuestionarios en MySQL, Base de datos de encuestas y sondeos en MySQL y aprenda consultas SQL básicas en MySQL.
Base de datos de la tienda
El primer paso es crear la base de datos de la tienda. Se puede crear usando la consulta como se muestra a continuación.
CREATE SCHEMA `shop` 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. La misma tabla se puede usar para administrar diferentes tipos de usuarios, incluidos administradores y clientes. También se puede usar para relacionar a los creadores de productos (desde el panel de administración) y los pedidos de los clientes realizados en el sitio web. Los usuarios pueden rastrear sus propios pedidos y rastrear el estado. 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. |
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. |
Administrador | La bandera para identificar si el usuario es un administrador. No es necesario si las tablas RBAC se crean siguiendo el diseño de la base de datos RBAC. |
Vendedor | La bandera para identificar si el usuario puede alojar un producto en la tienda. No es necesario si las tablas RBAC se crean siguiendo el diseño de la base de datos RBAC. |
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 | La breve introducción del usuario proveedor que se mostrará en la página del producto. |
Perfil | Los detalles del proveedor que se mostrarán en la página del producto. |
La tabla de usuarios con las restricciones adecuadas se muestra a continuación.
CREATE TABLE `shop`.`user` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`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,
`passwordHash` VARCHAR(32) NOT NULL,
`admin` TINYINT(1) NOT NULL DEFAULT 0,
`vendor` TINYINT(1) NOT NULL DEFAULT 0,
`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_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. |
ID de usuario | La identificación de usuario para identificar al administrador o proveedor. |
Título | El título del producto que se mostrará en la página de la tienda y en la página del producto. |
Metatítulo | El metatítulo que se usará para el título del navegador y SEO. |
Babosa | El slug para formar la URL. |
Resumen | El resumen para mencionar los aspectos más destacados. |
Tipo | El tipo para distinguir entre los diferentes tipos de productos. |
SKU | La Unidad de mantenimiento de existencias para realizar un seguimiento del inventario de productos. |
Precio | El precio del producto. |
Descuento | El descuento en el producto. |
Cantidad | La cantidad disponible del producto. |
Tienda | Se puede usar para identificar si el producto está disponible públicamente para comprar. |
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. |
Publicado en | Almacena la fecha y hora en que se publica el producto en la Tienda. |
Empieza en | Almacena la fecha y hora de inicio de la venta del producto. |
Termina en | Almacena la fecha y hora en que finaliza la venta del producto. |
Contenido | La columna utilizada para almacenar los detalles adicionales del producto. |
Utiliza la cantidad de columna para rastrear el stock disponible en el inventario de productos para mantener el diseño simple. Puede ser necesario especificar la cantidad en varias columnas para cubrir una amplia gama de productos. Las columnas posibles podrían ser sellQuantity, sellUnit, stockQuantity y stockUnit donde sellQuantity y sellUnit se pueden usar para mostrarse en la Tienda para los compradores y stockQuantity y stockUnit se pueden usar para rastrear el inventario. También puede ser necesario convertir sellUnit en stockUnit mientras se actualiza el inventario al realizar el pedido. La tabla de productos con las restricciones apropiadas se muestra a continuación.
CREATE TABLE `shop`.`product` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`title` VARCHAR(75) NOT NULL,
`metaTitle` VARCHAR(100) NULL,
`slug` VARCHAR(100) NOT NULL,
`summary` TINYTEXT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`sku` VARCHAR(100) NOT NULL,
`price` FLOAT NOT NULL DEFAULT 0,
`discount` FLOAT NOT NULL DEFAULT 0,
`quantity` SMALLINT(6) NOT NULL DEFAULT 0,
`shop` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`publishedAt` DATETIME NULL DEFAULT NULL,
`startsAt` DATETIME NULL DEFAULT NULL,
`endsAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_slug` (`slug` ASC),
INDEX `idx_product_user` (`userId` ASC),
CONSTRAINT `fk_product_user`
FOREIGN KEY (`userId`)
REFERENCES `shop`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
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 `shop`.`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 `shop`.`product` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Tabla de revisión de productos
En esta sección, diseñaremos la Tabla de revisión de productos para almacenar las reseñas de productos. A continuación se menciona la descripción de todas las columnas de la tabla de revisión de productos.
Id | La identificación única para identificar la revisión del producto. |
Identificación del producto | La identificación del producto para identificar el producto principal. |
Id principal | La identificación principal para identificar la revisión principal. |
Título | El título de la reseña. |
Calificación | La calificación de revisión. |
Publicado | Se puede utilizar para identificar si la reseña está disponible públicamente. |
Creado en | Almacena la fecha y hora en que se envía la reseña. |
Publicado en | Almacena la fecha y hora en que se publica la reseña. |
Contenido | La columna utilizada para almacenar los detalles de la revisión. |
La tabla de revisión de productos con las restricciones apropiadas se muestra a continuación.
CREATE TABLE `shop`.`product_review` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`productId` BIGINT NOT NULL,
`parentId` BIGINT NULL DEFAULT NULL,
`title` VARCHAR(100) NOT NULL,
`rating` SMALLINT(6) NOT NULL DEFAULT 0,
`published` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`publishedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_review_product` (`productId` ASC),
CONSTRAINT `fk_review_product`
FOREIGN KEY (`productId`)
REFERENCES `shop`.`product` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `shop`.`product_review`
ADD INDEX `idx_review_parent` (`parentId` ASC);
ALTER TABLE `shop`.`product_review`
ADD CONSTRAINT `fk_review_parent`
FOREIGN KEY (`parentId`)
REFERENCES `shop`.`product_review` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
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 `shop`.`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 `shop`.`category`
ADD INDEX `idx_category_parent` (`parentId` ASC);
ALTER TABLE `shop`.`category`
ADD CONSTRAINT `fk_category_parent`
FOREIGN KEY (`parentId`)
REFERENCES `shop`.`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 `shop`.`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 `shop`.`product` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_pc_category`
FOREIGN KEY (`categoryId`)
REFERENCES `shop`.`category` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
Tabla de etiquetas y tabla de etiquetas de productos
Similar a las tablas de categorías y categorías de productos, podemos diseñar la Tabla de etiquetas y Tabla de etiquetas de productos . Las principales diferencias entre la categoría y la etiqueta se enumeran a continuación.
- La columna parentId no es obligatoria en la tabla de etiquetas.
- El recuento de categorías sigue siendo bajo, ya que se pueden usar para formar el menú principal con fines de navegación. Las etiquetas pueden ser más en comparación con las categorías.
- Se pueden utilizar tanto categorías como etiquetas para relacionar los productos.
- Se debe asignar solo unas pocas categorías a un producto, mientras que el recuento de etiquetas puede ser mayor.
Tabla de carro y tabla de artículos del carro
Esta sección proporciona las tablas para administrar los carritos virtuales para almacenar la selección del usuario antes de crear el pedido real. Si el usuario cancela el pago o el pago falla, el equipo de marketing puede utilizar los mismos carritos como un carrito abandonado para consultar sobre los compradores. Un usuario registrado también se puede asociar con el carrito. A continuación se menciona la descripción de todas las columnas de la tabla del carrito.
Notas :La tabla del carrito y la tabla de elementos del carrito se pueden hacer opcionales si se utiliza la base de datos de datos locales, de sesión o en memoria como Redis para almacenar los datos del carrito. Lo mismo se puede referir para crear el pedido en caso de éxito del pago.
Id | La identificación única para identificar el carrito. |
ID de usuario | El ID de usuario para identificar al usuario o comprador asociado con el carrito. |
Id de sesión | La identificación de sesión única asociada con el carrito. |
Símbolo | El token único asociado con el carrito para identificar el carrito en varias sesiones. El mismo token también se puede pasar a la pasarela de pago si es necesario. |
Estado | El estado del carrito puede ser Nuevo, Carrito, Finalizar compra, Pagado, Completo y Abandonado. |
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 carrito. |
Actualizado en | Almacena la fecha y hora en que se actualiza el carrito. |
Contenido | La columna utilizada para almacenar los detalles adicionales del carrito. |
La tabla del carro con las restricciones apropiadas se muestra a continuación.
CREATE TABLE `shop`.`cart` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NULL DEFAULT NULL,
`sessionId` VARCHAR(100) NOT NULL,
`token` VARCHAR(100) NOT NULL,
`status` SMALLINT(6) NOT NULL DEFAULT 0,
`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,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_cart_user` (`userId` ASC),
CONSTRAINT `fk_cart_user`
FOREIGN KEY (`userId`)
REFERENCES `shop`.`user` (`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 artículos del carrito.
Id | La identificación única para identificar el artículo del carrito. |
Identificación del producto | La identificación del producto para identificar el producto asociado con el artículo del carrito. |
Id del carrito | La identificación del carrito para identificar el carrito asociado con el artículo del carrito. |
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. |
Activo | La bandera para identificar si el producto está activo en el carrito. Se puede usar para evitar que el mismo producto se agregue al mismo carrito varias veces. |
Creado en | Almacena la fecha y hora en que se crea el artículo del carrito. |
Actualizado en | Almacena la fecha y hora en que se actualiza el artículo del carrito. |
Contenido | La columna utilizada para almacenar los detalles adicionales del artículo del carrito. |
La tabla de elementos del carrito con las restricciones adecuadas se muestra a continuación.
CREATE TABLE `shop`.`cart_item` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`productId` BIGINT NOT NULL,
`cartId` 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,
`active` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_cart_item_product` (`productId` ASC),
CONSTRAINT `fk_cart_item_product`
FOREIGN KEY (`productId`)
REFERENCES `shop`.`product` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `shop`.`cart_item`
ADD INDEX `idx_cart_item_cart` (`cartId` ASC);
ALTER TABLE `shop`.`cart_item`
ADD CONSTRAINT `fk_cart_item_cart`
FOREIGN KEY (`cartId`)
REFERENCES `shop`.`cart` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Tabla de pedidos y tabla de artículos de pedido
Esta sección proporciona las tablas para administrar los pedidos de la tienda. Un usuario registrado también se puede asociar con el pedido. 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 usuario o comprador asociado con el pedido. |
Id de sesión | La identificación de sesión única asociada con el pedido. |
Símbolo | El token único asociado con el pedido para identificarlo en varias sesiones. El mismo token también se puede pasar a la pasarela de pago si es necesario. |
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. |
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. |
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 `shop`.`order` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NULL DEFAULT NULL,
`sessionId` VARCHAR(100) NOT NULL,
`token` VARCHAR(100) NOT NULL,
`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,
`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,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_order_user` (`userId` ASC),
CONSTRAINT `fk_order_user`
FOREIGN KEY (`userId`)
REFERENCES `shop`.`user` (`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 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. 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 `shop`.`order_item` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`productId` 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 `shop`.`product` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `shop`.`order_item`
ADD INDEX `idx_order_item_order` (`orderId` ASC);
ALTER TABLE `shop`.`order_item`
ADD CONSTRAINT `fk_order_item_order`
FOREIGN KEY (`orderId`)
REFERENCES `shop`.`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 `shop`.`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 `shop`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `shop`.`transaction`
ADD INDEX `idx_transaction_order` (`orderId` ASC);
ALTER TABLE `shop`.`transaction`
ADD CONSTRAINT `fk_transaction_order`
FOREIGN KEY (`orderId`)
REFERENCES `shop`.`order` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Tabla de direcciones
Se puede usar una tabla de direcciones para evitar las columnas redundantes en la tabla Carrito y Orden dependiendo de la implementación real. Se puede asignar directamente a la tabla de carritos y a la tabla de pedidos usando las claves foráneas apropiadas.
Resumen
En este tutorial, hemos discutido el diseño de la base de datos de un carrito de compras en línea para almacenar a los usuarios y administrar el inventario de productos. También proporcionó el diseño de la base de datos para administrar el carrito, almacenar los artículos del carrito y administrar los pedidos en una tienda en línea. El diagrama de flujo de compras en línea simplificado se puede consultar para implementar un carrito de compras.
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.