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)
几个问题:
首先,您需要一个价格标签模型,这很简单:
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)
在这里,我只是取代了标签与相应的ID从price_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)销售税率不是购买商品的地方因素而不是购买商品的因素吗?我可以看到"IsTaxable"字段,但指定每个项目的速率似乎不正确.
2)你确定需要承担制作这种通用的费用吗?您是否已经相当确定将来会有更多因素?如果没有,请不要过度复杂化.
建议设计:
- 在产品表中为IsTaxable,DiscountPct和Unit Price添加列.
- 将销售税百分比存储在另一个表中.可能是发票表.