存储数据库中的佣金拆分并确保数据库完整性

时间:2010-01-21 16:01:06

标签: database-design

以下是背景资料:

销售代理销售保险。他们独自工作或在2人或以上的机构工作。当多个代理一起工作时,他们需要分配佣金。佣金分配是按百分比预定义的。

实施例

Joe,John和Saul属于一家代理商。

对于每一个出售的政策,乔获得40%的佣金,约翰获得35%,索尔得到25%。

每个代理人独自工作或是一个(也是唯一一个)代理商的成员。

在数据库中对此进行建模的显而易见的方法是3个表:Agents表,Agency表和AgencyCommissionSplits表。

代理商表:

AgentID int PK
AgentName vchar(30),
AgencyID int FK Nullable

代理商表:

AgencyID int PK,
AgencyName vchar(30)

CommissionSplits表:

AgencyID int FK,
AgentID int FK,
Percentage dec(3,1)
(compound PK AgencyID, AgentID)

我看到的问题是我不知道如何确保任何特定代理商的百分比总计总计为100%。我可以尝试在前端执行此操作,但我真的更喜欢数据库中的一种方法来强制执行此约束。

5 个答案:

答案 0 :(得分:3)

这是关于数据库约束的经典鸡蛋或鸡蛋情景。虽然立即选项似乎是编写检查约束,但这是不实际的,因为在约束能够验证它之前数据必须在表中。如果您正在创建一个新代理商,那么您将要插入新行,将您的表(暂时)置于百分比不等于100%的状态。

您最好的选择是在应用程序级别强制执行此操作;任何数据库解决方案(如果一个存在的话)可能是相当多的hackery(尽管我很高兴在此证明是错误的。)

答案 1 :(得分:0)

您熟悉Check约束(在SQL Server中)吗?它们非常灵活,可用于强制执行此处描述的情况。

答案 2 :(得分:0)

在我看来,模型太简单了,但这取决于代理商/设置的复杂程度。

“特工乔”可以离开该机构并开始在另一个机构工作,但他以前的代理机构的持续佣金仍然必须与他联系。他是指定时间点(遵守您的规则)的1个且仅有1个代理机构的成员,但数据库可能需要在历史上准确处理随时间支付的佣金。

当他们用'Bill'取代'Joe'时,除非考虑该日期,否则所有代理商对该机构的百分比将再次超过100%。

我也不排除随着代理商变得更大,他们被允许更多的组合,因此10个销售人员不会自动获得每个政策的百分比,但他们指出谁销售产品以及各自的佣金是

就您的具体设计而言,Agent.AgencyID可以是nullabe,但佣金分配需要Agent和AgencyID,因此除非您考虑缺少佣金分配记录= 100%,否则会导致您出现问题。< / p>

答案 3 :(得分:0)

如果你需要它在数据库中,这是在触发器中做得最好的事情。但它会很复杂。

然而。你问题的一部分是输入数据库的第一个人(在你输入另外两个将进行拆分的人之前)将不会加起来100,除非第一个人是alawys的100.那么你如何确定当更新加起来超过100或小于100时该怎么办?如果数字加起来不是100%,你从谁那里削减了一个百分比,或者你将它添加到谁?

最好将记录标记为不添加到100%,并在手动清除问题之前拒绝apy协议。

答案 4 :(得分:-1)

“我可以尝试在前端执行此操作,但我真的更喜欢数据库中的一种方法来强制执行此约束。”

可以为您执行此操作的唯一现有DBMS是我自己的:http://shark.armchair.mb.ca/~erwin

约束聚合(并在效率/性能的最高水平上进行)是(并且我温和地说)约束执行中更棘手的问题之一,世界上没有一个人除外我知道该怎么做。

你可以相信我,你可以找到我的傲慢与否,但我告诉你的是,你不会从任何一个主要的DBMS中获得“在数据库中实施这种约束的方式”供应商在任何最早的几十年中都会出现。他们没有线索,事实上他们并不真正关心这个问题。

如果你坚持使用来自专业的垃圾DBMS,请阅读其他解决方案,并执行类似“只是将记录标记为不添加到100%并拒绝apy协议,直到问题被手动清除。”。< / p>