首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数据库模式-可配置字段?

数据库模式-可配置字段?
EN

Stack Overflow用户
提问于 2014-04-16 19:33:18
回答 3查看 547关注 0票数 4

我出售引线,并像这样向我的客户收取费用:(只能从客户处收取以下一种付款)

每引线支付:

$__用于每月第一次__引线

$__用于每月下一次__引线

$__用于每月下一次__引线

等等..。

每次预约薪酬:

$__用于每月第一次__引线

$__用于每月下一次__引线

每月用于下一个__引线的$ __

等等..。

按销售百分比支付:

销售价格的__% (每次销售)

我的问题:

在这种情况下,最好的数据库设计解决方案是什么?

我尝试过的:

代码语言:javascript
运行
复制
+---------+ 
| clients |
+---------+
| id      |
| name    |
+---------+

+---------------+
|     deals     |
+---------------+
| client_id     |
| max_quantity  | 
| cost          |
| unit_type     |
+---------------+

因此,使用id 1的客户端记录可能如下所示:

代码语言:javascript
运行
复制
+-----------+--------------+---------------+-------------+
| 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将按lead10引线收费。

$5将按lead30引线收费。

$2将按lead100引线收费。

$35将按appointment10引线收费。

$20将按appointment30引线收费。

$10将按appointment100引线收费。

$5将按appointment1000引线收费。

$50将按sale收费

此外,我还想添加这样的规则的x号码(每次领先,每次约会,每次销售)

我个人并不认为我的方法是最好的解决方案之一。期待听到你们的切碎!谢谢。

我知道unit_type可以进一步规范化,但这不是问题所在:)

更新

也许我可以存储序列化的数据?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-20 18:48:15

您提出的模式是一个很好的开端,也有一些优点。不太优雅的部分是unit_type值的非正规化重复和sale的非功能性max_quantity值。

建议将deals拆分为三个表,而不是一个表。会以单数表名而不是复数表名**开头,以相同的前缀开头,这样它们就会彼此相邻地列出:类似于commission_leadcommission_appointmentcommission_sale

** [关于这一here的大量辩论]

还会建议在每一行中包括上下两层。这确实使用了比严格需要的更多的数据,但认为值得这样做,因为它应该使表数据更易读,并简化计算查询。

因此,提议的新模式是:

代码语言:javascript
运行
复制
+---------+ 
| 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的记录如下:

代码语言:javascript
运行
复制
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 |
+-----------+---------------+
票数 4
EN

Stack Overflow用户

发布于 2014-04-22 14:14:59

我假设更改非常罕见(更新/插入),大多数情况下使用select来计算成本,所以我提出这个设计,选择计算成本非常简单。

代码语言:javascript
运行
复制
+-----------+--------------+---------------+---------------+--------------+------------+
| 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|
+-----------+--------------+---------------+---------------+--------------+------------+

选择查询看起来像

代码语言:javascript
运行
复制
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 
票数 2
EN

Stack Overflow用户

发布于 2014-04-24 21:19:41

如果考虑到未来可能发生变化的成本计算业务逻辑,并且不需要根据计算常量对表进行筛选/排序,我建议为rule_id设置一个列,该列与您的unit_type非常类似,还有一个称为属性的varchar列,其中该规则所需的所有特定值都存储在分隔符中。

然后检索将客户端应用于业务逻辑的规则,并在那里进行计算。如果您需要一个突然接受5个参数的新规则,则不需要更改数据库模式。只要在业务逻辑中为一个新的rule_id编写代码,就可以了。

当然,如果您希望将计算逻辑移到存储过程中,并且/或需要按规则属性进行筛选或排序,我认为应该为每个规则参数提供单独的列.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23118561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档