Esquema de base de datos para precios de productos (paquetes, promociones, cantidad, oferta por tiempo limitado ...)

11

Estoy trabajando en un nuevo punto de venta para una empresa que ofrece productos a diferentes precios según la combinación de productos.

Todos los productos tienen un precio base.

Para explicar mi problema, usaré la siguiente información:

Product         Category        Price
A               1               45
B               1               70
Q               2               20
R               2               27
S               2               15
X               3               17
Y               3               22
Z               3               16

La compañía tiene Paquetes, por ejemplo Paquete "Combo": para el producto A o B, si elige 1 de Q o R y 1 de X, Y o Z obtendrá un descuento de $ 20.

Caso A: a veces los clientes agregan un producto base al realizar un pedido, por ejemplo: no quieren uno del Producto A, y agregan el Producto Q y el Producto P para crear un paquete que tiene un precio con descuento. Luego podrían agregar que quieren 1 del producto B con 1 R y 1 Z.

Caso B: a veces los clientes agregarán 1 A y 2 B, 2 Q, 1 S, 2 X y 1 Z. De acuerdo con las reglas establecidas por el paquete "Combo", solo se aplicarían 2 combos porque S no es un elemento combinado.

Otras promociones dependen de la cantidad, por lo que si compra 2 de B obtiene un 20% de descuento y / o depende del tiempo, solo es válido después de las 5 p.m. o antes del 10% de descuento si antes de las 10 a.m. Otra promoción puede depender de cuándo ocurrió su última compra o si ha comprado más de $ X en el marco temporal Y.

Mis problemas:

1) ¿Cómo estructuro las tablas para poder crear los diferentes paquetes o promociones de una manera que sea muy flexible para agregar diferentes tipos de promociones con diferentes requisitos?

2) Cuando hacen un pedido como el Caso B (o una combinación de Caso A y Caso B), ¿cómo puedo estructurar mi consulta para poder comprobar qué mezclas de productos hay en el pedido y actualizar los precios / descripciones en consecuencia? ? En última instancia, el mejor resultado para esta consulta sería devolver qué paquetes y promociones tienen requisitos cumplidos en orden de los cuales brinda el mayor beneficio para el cliente (es decir, tal vez lo que ordenaron cumple con los requisitos para las promociones 1 y 3, pero la promoción 3 es menos costosa). debe trabajar con múltiples promociones).

Gracias de antemano por la ayuda!

ACTUALIZACIÓN # 1

Para describir mejor los problemas en cuestión y actualizar el trabajo realizado hasta el momento para resolverlos , incluyo un ERD del modelo de producto limitado a las entidades y atributos que afectan el problema (es decir, el inventario no está en juego aquí, por lo que no hay inventario las entidades están presentes).

ingrese la descripción de la imagen aquí

También incluyo datos de muestra de las entidades y atributos que afectan esta pregunta (para simplificar la lectura de los datos, pongo el nombre / las descripciones en lugar de las claves externas):

Aquí hay un enlace a un diagrama de flujo que da un ejemplo de un combo, una forma rápida y visual de comprender la estructura de la tabla.

PRODUCT
---------
ID  Name
================================
1   Hamburger
2   Cheeseburger
3   Bacon Hamburger
4   Bacon Cheeseburger
5   Orange Juice
6   Apple Juice
7   Coffee
8   Coke
9   French Fries
10  Onion Rings
11  Soup du Jour
12  Hamburger Combo
13  CheeseBurger Combo
14  Bacon Hamburger Combo
15  Bacon Cheeseburger Combo
16  Combo Side
17  Combo Beverage
18  Small Orange Juice
19  Large Orange Juice
20  Small Apple Juice
21  Large Apple Juice
22  Add Extra Patty
23  Add Avocado

PRODUCT COMPONENT
------------------
productFrom                 productTo       
===================================================
Hamburger Combo             Hamburger
Hamburger Combo             Combo Side
Hamburger Combo             Combo Beverage
CheeseBurger Combo          Cheeseburger
CheeseBurger Combo          Combo Side
CheeseBurger Combo          Combo Beverage
Bacon Hamburger Combo       Bacon Hamburger
Bacon Hamburger Combo       Combo Side
Bacon Hamburger Combo       Combo Beverage
Bacon Cheeseburger Combo    Bacon Cheeseburger
Bacon Cheeseburger Combo    Combo Side
Bacon Cheeseburger Combo    Combo Beverage

PRODUCT FEATURE
----------------
ID  Description
=======================
1   Combo Side Option
2   Combo Beverage
3   Juice
4   Orange Juice Size
5   Apple Juice Size
6   Extras

PRODUCT FEATURE APPLICABILITY
------------------------------
product                     productFeature  ProductFeatureApplicabilityType
============================================================================
Hamburger Combo             Combo Side      Required
Hamburger Combo             Juice Flavor    Required
Cheeseburger Combo          Combo Side      Required
Cheeseburger Combo          Juice Flavor    Required
Bacon Hamburger Combo       Combo Side      Required
Bacon Hamburger Combo       Juice Flavor    Required
Bacon Cheeseburger Combo    Combo Side      Required
Bacon Cheeseburger Combo    Juice Flavor    Required


PRODUCT FEATURE APPLICABILITY
------------------------------
productFeature  product             ProductFeatureApplicabilityType
============================================================================
Combo Side      Hamburger Combo             Required
Combo Beverage  Hamburger Combo             Required
Extras          Hamburger Combo             Optional
Combo Side      Cheeseburger Combo          Required
Combo Beverage  Cheeseburger Combo          Required
Extras          Cheeseburger Combo          Optional
Combo Side      Bacon Hamburger Combo       Required
Combo Beverage  Bacon Hamburger Combo       Required
Extras          Bacon Hamburger Combo       Optional
Combo Side      Bacon Cheeseburger Combo    Required
Combo Beverage  Bacon Cheeseburger Combo    Required
Extras          Bacon Cheeseburger Combo    Optional




OPTIONAL FEATURE
------------------
productFeatureFrom  Product             ProductFeatureTo        
=============================================================
Combo Side Option   French Fries
Combo Side Option   Onion Rings
Combo Side Option   Soup du Jour
Combo Beverage                          Juice
Combo Beverage      Coffee
Juice                                   Orange Juice Size
Juice                                   Apple Juice Size
Orange Juice Size   Orange Apple Juice
Orange Juice Size   Orange Apple Juice
Apple Juice Size    Small Apple Juice
Apple Juice Size    Large Apple Juice
Extras              Add Extra Patty
Extras              Add Avocado

Entonces, con la investigación y el apoyo brindado por la comunidad hasta ahora, he podido resolver el problema # 1. De hecho, lo hice con más flexibilidad de lo que pensé que podría hacer en la primera implementación del sistema.

A pesar de que ha habido avances con el problema 2, no se resuelve satisfactoriamente. Ha habido algunas ideas sobre cómo hacer esto, Neil McGuilgan hizo una gran pregunta que condujo a una posible solución utilizando la División Relacional (dba.stackexchange.com/questions/45829/what-is-the-name-of-this-type- of-query-and-what-is-an-eficiente-example) y este libro (www.amazon.com/books/dp/0471380237) fue de gran ayuda. Sin embargo, esta solución en la actualidad, y según tengo entendido, solo funciona con "un" registro (combo) a la vez. Si un cliente camina y dice que quiere 2 hamburguesas con queso, 1 hamburguesa, 1 jugo de manzana pequeño, 1 Coca-Cola, 1 papas fritas y 2 aros de cebolla, necesito una forma de detectar que solo hay un combo en la mezcla y agregar el otro productos a precio base. Si hay múltiples combinaciones de combo, yo '

Una idea que se me ocurrió para resolver el problema dos es agregar y atribuir a COMPONENTES DEL PRODUCTO marcando el producto principal para el combo (es decir, hamburguesa). Luego, cuando ejecute el proceso de fijación de precios, consulte qué productos en el pedido son productos principales en un "paquete", relacionando la consulta con el descuento dado por la tabla COMPONENTE DE PRECIOS y ordenando por ese valor (descendente), y en ese orden de paquetes verifique para ver si puede crear un "paquete" con los productos no principales restantes con una consulta y repetir el proceso hasta que no haya más productos principales o no haya más productos no principales en el resto.

cml
fuente
Que has hecho hasta ahora ? Muéstranos un diagrama ER.
Tulains Córdova
@ user61852 Hago la mayoría de mis ERD a mano. ¿Me puede recomendar una herramienta para hacerlas en la computadora para que pueda compartirla? (espero que sea gratis :)
cml
@ user61852 Encontré gliffy.com que está demostrando ser bastante útil. Estoy trabajando en reunir lo que he trabajado para actualizar mi pregunta.
cml
@ user61852 He agregado la actualización n. ° 1 para mostrar ERD, diagrama de flujo, avances y datos de la tabla de muestra.
cml

Respuestas:

2

Esto podría complicarse ...

1) ¿Cómo estructuro las tablas para poder crear los diferentes paquetes o promociones de una manera que sea muy flexible para agregar diferentes tipos de promociones con diferentes requisitos?

Puede comenzar con una packaged_withtabla para determinar qué productos se pueden agrupar y empaquetar:

paquete
-------
  id (PK)
  nombre

grupo_paquete
-------------
  package_id (FK a package.id)
  nombre

empaquetado_con
-------------
  package_group_id (FK a package_group.id)
  product_id (FK a product.id)
  can_be_packaged_with (FK a product.id)

package_groupse refiere a a package. packaged_withse refiere a productsy package_groups, de modo que una fila en packaged_withmuestra con qué productos se puede empaquetar un producto, y un paquete puede estar compuesto por múltiples grupos.

Los datos se verían así:

paquete
-------
ID | nombre
------------
1 | Combo

grupo_paquete
------------
ID | nombre
---------
1 | Grupo QR
2 | Grupo XYZ

empaquetado_con
-------------
package_group_id | id_producto | can_be_packaged_with
----------------------------------------------
1 | A | Q
1 | A | R
2 | A | X
2 | A | Y
2 | A | Z
1 | B | Q
1 | B | R
2 | B | X
2 | B | Y
2 | B | Z

Esto lo ayudará con los paquetes de productos en sí. Tengo algunas ideas para el resto de su pregunta, pero no tengo tiempo para terminar esta respuesta en este momento ...


Promociones

Usted enumera muchos tipos de promociones. Es posible que desee buscar algún tipo de motor de reglas, pero trataré de mantener las cosas más simples que eso, pero aún así ... Esto se complicará ...

Comencemos con promociones simples donde un precio tiene un cierto porcentaje de descuento:

porcentaje_descuento
----------------
  id (PK)
  nombre
  porcentaje_cantidad

promociones_productos
------------------
  id (PK)
  product_id (FK a product.id)
  promotion_id (FK a percent_discount.id)
  fecha de inicio
  fecha final

Aquí tenemos una tabla que almacena el porcentaje que obtiene por producto. Otra tabla en realidad vincula los productos a la tasa de descuento, y también incluye una fecha de inicio y finalización para que sepa si el descuento es aplicable en una fecha determinada.

Ideas para las otras promociones que vendrán después ...

FrustratedWithFormsDesigner
fuente
Espero leer el resto de su respuesta cuando tenga tiempo para escribirla. Gracias por tu ayuda.
cml
¡Definitivamente voy a investigar los "motores de reglas"! Si tienes buenos enlaces de recursos, ¡envíalos a mi manera! Mi mayor problema es saber qué promociones se aplican a una lista desordenada y no agrupada de artículos de pedido (Caso B).
cml
@cml: Sé que hay productos comerciales que probablemente ya tienen las capacidades que deseas. Una que conozco se llama Hybris, he oído que tiene un sistema de promociones muy sofisticado.
FrustratedWithFormsDesigner
Agregué la
1

Aunque es un hilo de 3 años, todavía lo respondo pensando que podría ser útil para alguien.

Table Structure
Table_Offer
--------
ID FK
Name   
start time  
end time   

MandatoryGroup
--------
ProductId (FK to product)

MixGroup1
--------
ProductId (FK to product)


MixGroup2
--------
ProductId (FK to product)


Table_offerDetails
------------------
ID PK
offerId (FK to table_offer)
MandatoryProduct(FK to MandatoryProducts.productID
firstProduct ( fk to MixGroup1.productId)
secondProduct (FK to MixGroup2.productId)

Offer
----
 ID    name    startDate  EndDate 
---    ----     --------   ------
1       COMBO   


MandatoryGroup
-------------
 ID    name 
 ---   ---- 
1      A
2      B


MixGroup1
---------
 ID    name 
 ---   ---- 
 3      P      
 4      Q

MixGroup2
---------
 ID    name 
 ---   ---- 
 5      x      
 6      Y
 7      Z



 OfferHeader
-------------
ID  Customer count(B) B_disc time_disc  stat_disc DiscTotal orderPayableTotal
--  --------- -------  ----   --------  ---------  --------  ------------    
1     BOB     2         20      5         2             

Detalles de la oferta ------------

 ID   offerID   MandatoryProduct     1stProduct    2ndProduct
----  -------    ---------------     ----------    ----------
1       1         A                     P              X
2       1         A                     P              Y
3       1         A                     P              Z
4       1         A                     Q              X
5       1         A                     Q              Y
6       1         A                     Q              Z
7       1         B                     P              X
8       1         B                     P              Y
9       1         B                     P              Z
10      1         B                     Q              X
11      1         B                     Q              Y
12      1         B                     Q              Z

Para construir una ofertaDetalles, debe proporcionar un obligatorio, mixgropu1 y amixGropu2. Entonces caseB, tiene solo 2 ofertas de la siguiente manera:

1 A and 2 B, 2 Q, 1 S, 2 X and 1 Z
2B 2Q and 2X =2 offers
1A 1Q and 1X=1st offer
1B 1Q and 1X=2nd Offer ... etc other combinations are vivid.

Otras ofertas se basan en la lógica del negocio: Para descuentos por cantidad: cree una consulta para encontrar el recuento de B en una oferta para un cliente. vamos a llamarlo QTYB encuentre QTYB% 2 y multiplíquelo con la cantidad Valor de oferta (que es $ 20)

Para la oferta de estadísticas, simplemente agregue otro bit llamado wonPoint para la compra de un cliente. y establezca el punto ganado una fecha de vencimiento. El punto ganado puede ser igual al monto comprado. Verifique si la cantidad comprada> = $ X, ellos emiten un descuento según la política.

Similar es la comparación del tiempo de pedido si es antes de las 5 p.m. y después de las 10 a.m., luego emite un 5%, de lo contrario, emite un 10% de descuento.

123456
fuente