我出售引线,并像这样向我的客户收取费用:(只能从客户处收取以下一种付款)
每引线支付:
$__用于每月第一次__引线
$__用于每月下一次__引线
$__用于每月下一次__引线
等等..。
每次预约薪酬:
$__用于每月第一次__引线
$__用于每月下一次__引线
每月用于下一个__引线的$ __
等等..。
按销售百分比支付:
销售价格的__% (每次销售)
我的问题:
在这种情况下,最好的数据库设计解决方案是什么?
我尝试过的:
+---------+
| clients |
+---------+
| id |
| name |
+---------+
+---------------+
| deals |
+---------------+
| client_id |
| max_quantity |
| cost |
| unit_type |
+---------------+
因此,使用id
1的客户端记录可能如下所示:
+-----------+--------------+---------------+-------------+
| client_id | max_quantity | cost_per_unit | unit_type |
+-----------+--------------+---------------+-------------+
| 1 | 10 | 10 | lead |
| 1 | 30 | 5 | lead |
| 1 | 100 | 2 | lead |
| 1 | 10 | 35 | appointment |
| 1 | 30 | 20 | appointment |
| 1 | 100 | 10 | appointment |
| 1 | 1000 | 5 | appointment |
| 1 | 0 | 50 | sale |
+-----------+--------------+---------------+-------------+
上表的意思是:
$10
将按lead
至10
引线收费。
$5
将按lead
至30
引线收费。
$2
将按lead
至100
引线收费。
$35
将按appointment
至10
引线收费。
$20
将按appointment
至30
引线收费。
$10
将按appointment
至100
引线收费。
$5
将按appointment
至1000
引线收费。
$50
将按sale
收费
此外,我还想添加这样的规则的x
号码(每次领先,每次约会,每次销售)
我个人并不认为我的方法是最好的解决方案之一。期待听到你们的切碎!谢谢。
我知道unit_type可以进一步规范化,但这不是问题所在:)
更新
也许我可以存储序列化的数据?
发布于 2014-04-20 18:48:15
您提出的模式是一个很好的开端,也有一些优点。不太优雅的部分是unit_type
值的非正规化重复和sale
的非功能性max_quantity
值。
建议将deals
拆分为三个表,而不是一个表。会以单数表名而不是复数表名**开头,以相同的前缀开头,这样它们就会彼此相邻地列出:类似于commission_lead
、commission_appointment
和commission_sale
。
** [关于这一here的大量辩论]
还会建议在每一行中包括上下两层。这确实使用了比严格需要的更多的数据,但认为值得这样做,因为它应该使表数据更易读,并简化计算查询。
因此,提议的新模式是:
+---------+
| client |
+---------+
| id |
| name |
+---------+
+-----------------+
| commission_lead |
+-----------------+
| client_id |
| min_quantity |
| max_quantity |
| cost_per_unit |
+-----------------+
+------------------------+
| commission_appointment |
+------------------------+
| client_id |
| min_quantity |
| max_quantity |
| cost_per_unit |
+------------------------+
+-----------------+
| commission_sale |
+-----------------+
| client_id |
| cost_per_unit |
+-----------------+
client_id = 1
的记录如下:
commission_lead
+-----------+--------------+--------------+---------------+
| client_id | min_quantity | max_quantity | cost_per_unit |
+-----------+--------------+--------------+---------------+
| 1 | 0 | 10 | 10 |
| 1 | 11 | 30 | 5 |
| 1 | 31 | 100 | 2 |
+-----------+--------------+--------------+---------------+
commission_appointment
+-----------+--------------+--------------+---------------+
| client_id | min_quantity | max_quantity | cost_per_unit |
+-----------+--------------+--------------+---------------+
| 1 | 0 | 10 | 35 |
| 1 | 11 | 30 | 20 |
| 1 | 31 | 100 | 10 |
| 1 | 101 | 1000 | 5 |
+-----------+--------------+--------------+---------------+
commission_sale
+-----------+---------------+
| client_id | cost_per_unit |
+-----------+---------------+
| 1 | 50 |
+-----------+---------------+
发布于 2014-04-22 14:14:59
我假设更改非常罕见(更新/插入),大多数情况下使用select来计算成本,所以我提出这个设计,选择计算成本非常简单。
+-----------+--------------+---------------+---------------+--------------+------------+
| client_id | max_quantity | min_quantity | cost_per_unit | default_cost | unit_type |
+-----------+--------------+---------------+---------------+--------------+------------+
| 1 | 10 | 0 | 10 | 0 | lead|
| 1 | 40 | 10 | 5 | 100 | lead|
| 1 | 140 | 40 | 2 | 250 | lead|
| 1 | 10 | 0 | 35 | 0 | appointment|
| 1 | 40 | 10 | 20 | 350 | appointment|
| 1 | 140 | 40 | 10 | 950 | appointment|
| 1 | 1140 | 140 | 5 | 1950 | appointment|
| 1 | 0 | 0 | 50 | 0 | sale|
+-----------+--------------+---------------+---------------+--------------+------------+
选择查询看起来像
select
default_cost + ($quantity - min_quantity) * cost_per_unit
from
table
where
unit_type = $unit_type
and (max_quantity >= $quantity or max_quantity = 0)
and $quantity >= min_quantity
发布于 2014-04-24 21:19:41
如果考虑到未来可能发生变化的成本计算业务逻辑,并且不需要根据计算常量对表进行筛选/排序,我建议为rule_id设置一个列,该列与您的unit_type非常类似,还有一个称为属性的varchar列,其中该规则所需的所有特定值都存储在分隔符中。
然后检索将客户端应用于业务逻辑的规则,并在那里进行计算。如果您需要一个突然接受5个参数的新规则,则不需要更改数据库模式。只要在业务逻辑中为一个新的rule_id编写代码,就可以了。
当然,如果您希望将计算逻辑移到存储过程中,并且/或需要按规则属性进行筛选或排序,我认为应该为每个规则参数提供单独的列.
https://stackoverflow.com/questions/23118561
复制相似问题