数据库设计:如何为产品/服务的通用价格因素建模?

Sta*_*bie 14 mysql database database-design

我正在尝试创建一个通用数据模型,允许特定产品(由下面的示例表中的FK product_id指示)指定0或更多价格"因子"(我将"因子"定义为增加的价格单位或减去以获得总数).

所以说有这个表:

===============================
price
===============================
price_id (PK)
product_id (FK)
label
operation (ENUM: add, subtract)
type (ENUM: amount, percentage)
value
Run Code Online (Sandbox Code Playgroud)

书的价格可能用这种方式表示:

====================================================================
price_id | product_id | label      |  operation | type       | value
====================================================================
 1       | 10         | Price      | add        | amount     | 20  
 2       | 10         | Discount   | subtract   | percentage | .25  
 3       | 10         | Sales Tax  | add        | percentage | .1
Run Code Online (Sandbox Code Playgroud)

这基本上意味着:

Price:      $20.00
Discount:  - $5.00 (25%)
--------------------
Sub Total:  $15.00
Sales Tax:   $1.50 (10%)
------------------------
Total:      $16.50
Run Code Online (Sandbox Code Playgroud)

几个问题:

  1. 初始设计有什么明显错误吗?
  2. 如果我想创建"模板"(例如具有"价格","折扣"和"销售税"字段的"一般商品"模板,具有"价格","折扣","奢侈税"的"奢侈品",该怎么办? "领域" - 我将如何建模?
  3. 如果每条记录适用于前一记录的总数,则上述模型有效.因此,在该示例中,"销售税"适用于"价格"和"折扣"的差异.如果总计没有简单计算怎么办?例如:A + B +(A + 10%) - (B - 5%).我该如何建模呢?
  4. 另外,如果"百分比"类型不适用于前一行(如问题#3所示)并应用于多于一行,该怎么办?我是否需要另一张表来逐项列出哪个价格 - > price_id该百分比适用于哪个?

geo*_*kis 6

首先,您需要一个价格标签模型,这很简单:

price_labels
 id | label 
  1 | Price 
  2 | Discount 
  3 | Tax
Run Code Online (Sandbox Code Playgroud)

然后是您给出的示例表的略微修改版本:

products_prices
price_id|product_id|label_id|divider|value 
  1         10        1        1      20 
  2         10        2        100   -25 
  3         10        3        100    10 
Run Code Online (Sandbox Code Playgroud)

在这里,我只是取代了标签与相应的IDprice_labels表的外键.另外,我省略了类型字段,这是微不足道的,因为值可以是正浮点数或负浮点数.我添加了divider列以启用百分比参数.我认为它也更容易以这种方式阅读,因为你说(并且认为)"减去百分之二十五"而不是0.25.

现在表达"抽象"部分有点复杂,可能有很多解决方案.

price_expressions
product_id | date_from          | date_until          | expression
  10       |2011-11-02 04:00:00 |2011-11-12 04:00:00  | (SELECT divider*value from 
                                                         products_prices 
                                                         WHERE product_id=%PRODUCT_ID%    
                                                         AND label_id=1)*
                                                        (SELECT 1+value/divider from products_prices 
                                                         where product_id=%PRODUCT_ID% AND 
                                                         label_id=2)*
                                                        (SELECT 1+value/divider from products_prices 
                                                         where product_id=%PRODUCT_ID% AND                                  
                                                         label_id=3)
Run Code Online (Sandbox Code Playgroud)

在表达式字段中,您可以存储一个复杂的SQL语句,您可以在其中使用同一行中的product_id值替换%PRODUCT_ID%占位符:

SELECT REPLACE(expression,'%PRODUCT_ID%',CAST(product_id AS char)) 
AS price_expression FROM price_expressions 
WHERE product_id = 10 AND date_from>=DATE_OF_PURCHASE 
AND date_until<=DATE_OF_PURCHASE
Run Code Online (Sandbox Code Playgroud)

我看到它的方式有两种可能的变化:

  1. 您只需使用price_id = N即可更改product_id =%PRODUCT_ID%和label_id = N条件,因为您已将其存储在products_prices表中
  2. 您可以使用其他表达式格式,例如%PRICE_ID_1%*%PRICE_ID_2,并在应用程序级别上执行替换和计算,而不是直接在SQL中执行

希望这可以帮助.


Joh*_*nFx 5

这似乎有点过度设计.

1)销售税率不是购买商品的地方因素而不是购买商品的因素吗?我可以看到"IsTaxable"字段,但指定每个项目的速率似乎不正确.

2)你确定需要承担制作这种通用的费用吗?您是否已经相当确定将来会有更多因素?如果没有,请不要过度复杂化.

建议设计:
- 在产品表中为IsTaxable,DiscountPct和Unit Price添加列.
- 将销售税百分比存储在另一个表中.可能是发票表.