sql >> Base de Datos >  >> RDS >> Mysql

Guía para diseñar la base de datos para el carrito de compras en línea en MySQL

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.