我有一个要求,我认为必须经常发生在世界各地。我有两个连接在一起的记录,每当对它们进行更改时,将创建新的一对记录并保留相同的链接。
我所做的要求与保险业有关,它要求我关闭当前的保险单,并在新的行中重新激活它们,以显示对保险单所做的更改的历史。当它们被重新创建时,它们仍然需要连接在一起。
关于如何从数据库中的行视图中处理此过程的示例:
保险Id,保险类型,主保险Id,状态
1,自动保险,空,活动
2,风屏保险,1,活动
在上面的说明中,这些策略之间的链接是如何由第二行的主保险Id来表示的,该Id指向第一行的保险Id。
在我编写的代码中,我每次处理每个策略,所以在第一步之后,我有以下内容:
1,自动保险,空,非活动
2,风屏保险,1,活动
3,自动保险,null,Active
当我处理第二个策略时,我得到以下信息:
1,自动保险,空,无效
2,风屏保险,1,非活动
3,自动保险,空,活动
4,风屏保险,1,活动/需要3而不是1
您会注意到,当我创建新的Window Insurance时,由于我们复制了旧行,所以最终的主Id保险指向不活动的行。
为了解决这一问题,我必须跟踪已处理的前一份保单的主保险id,该id导致了以下代码:
int masterInsuranceId = -1;
foreach(Policy policy in policyList)
{
//copy the old policy so the new policy has
//the same details as the old one
Policy newPolicy = policyManager.Copy(policy);
//if the new policy is not the master insurance store
//the master its new master insuance
if(newPolicy.MasterInsuranceId.HasValue)
{
newPolicy.MasterInsuranceId = masterInsuranceId;
}
//save the details of the new policy
policyManager.SavePolicy(newPolicy);
//record the master id so we can update the master id
//reference on the next policy
if(newPolicy.MasterInsuranceId == null)
{
masterInsuranceId = newPolicy.Id;
}
else
{
masterInsuranceId = -1;
}
//inactivate the current policy
policy.Status = Inactive;
policyManager.UpdatePolicy(policy);
}有人知道如何简化这个程序吗?确保两个记录保持联系的最佳方式是什么,即使每次更改记录都记录了更改的历史记录?
发布于 2009-09-14 09:38:01
感谢所有给出答案的人。不幸的是,由于在工作中的条件,我无法实现数据库更改,我只能尝试用编码解决方案来解决问题。
在这个问题上花了一段时间之后,我想出了一个解决方案,我相信它简化了一些代码,尽管它还远远不够完美。
我将该功能提取到一个新方法中,并传入我希望链接到的主策略。
Policy Convert(Policy policy, Policy masterPolicy)
{
Policy newPolicy = policyManager.Copy(policy);
//link the policy to it's master policy
if(masterPolicy != null)
{
newPolicy.MasterPolicyId = masterPolicy.Id;
}
SavePolicy(newPolicy);
//inactivate the current policy
policy.Status = Inactive;
policyManager.UpdatePolicy(policy);
return newPolicy;
}这允许我循环遍历所有策略并传递需要链接的策略,只要策略在正确的order...which中排序--在我的示例中是按开始日期,然后是主策略id。
Policy newPolicy = null;
foreach(Policy policy in policyList)
{
Policy masterPolicy = policy.MasterPolicyId.HasValue ? newPolicy : null;
newPolicy = Convert(policy, masterPolicy);
}当所有这些都说了又做了,代码就没有那么少了,但我相信它更容易理解,并且允许转换单个策略。
发布于 2009-09-11 06:11:04
您使用的是什么类型的数据库架构?通常,这是应该存储关系的地方,我认为这应该在数据处理级别而不是代码中处理。
这里有一个非常简单的建议
保险(< insurance_id >,名称,描述)
insurance_item(< item_id >,< insurance_id >,名称,描述)
insurance_item_details(< item_id >,< policy_id >,when_changed)
insurance__policy与insurance_item有1到多的关系。insurance__item与insurance_item_details有一对多的关系。insurance__item__details中的每一行表示策略的更改。
这样,SQL就可以快速检索最新的两个项。
SELECT FROM insurance_item_details, insurance_item, insurance where
insurance_item_details.item_id = insurance_item.item_id
AND insurance_item.insurance_id = insurance.insurance_id
ORDER BY when_changed
LIMIT 1或者你甚至可以找回历史。
(未尝试使用SQL )
所以我们的想法是,不要复制insurance_item --你有另一个表来存储将要被更改的元素,然后用它打一个时间戳,表示这种变化是一种关系。
我不是一个SQL专家,但您需要做的就是插入到insurance_item_details表中,而不是复制。从它的外观看,复制像你原来的例子似乎违反了2NF,我认为。
发布于 2009-09-11 13:22:50
如果您的代码设计很糟糕,并且需要进行更改,您会重构吗?THen为什么不考虑重构一个糟糕的数据库设计?这是通过良好的设计在数据库中处理得更好的东西。
如果您在数据密集型的保险业工作,而且在数据库设计和查询技能方面不强,我建议您将此作为优先事项。
https://stackoverflow.com/questions/1409206
复制相似问题