2009-09-11 96 views
0

我有一个要求,我相信必须在世界各地频繁发生。我有两条链接在一起的记录,每当对它们进行更改时,都会创建一对新记录并保留相同的链接。如何轻松地将数据库中的记录链接在一起?

我正在处理的要求与保险行业有关,该保险业要求我停用当前的保险单并在新行中重新激活它们以显示保险单更改的历史记录。当他们重新创建时,他们仍然需要联系在一起。

的这个过程是如何打算从行视图在一个数据库中的示例:

保险证,保险类型,主保险ID,状态

1,汽车保险,空,活动

2,防风保险,1,活动

注意上面如何将这些政策之间的联系是通过第二排指向第一行的保险标识的主保险编号表示。

在我写我在同一时间处理每一个政策一个这样的第一步骤的代码,我有以下几点:

1,汽车保险,空,无效

2 ,防风保险,1,活动

3,汽车保险,空,活动

当我处理第二个政策,我得到了FOL降脂:

1,汽车保险,空,无效

2,防风保险,1,无效

3,汽车保险,空,活动

4,防风保险,,活动//需要是3而不是1

您会注意到当我创建新窗口保险时,由于我们复制了旧行,因此我们最终Master 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); 

} 

有谁知道这可能是简化?确保两条记录的最佳方式将保持相互关联,即使对记录的每次更改都记录了更改的历史记录。

回答

0

谢谢大家谁提供了答案。不幸的是,由于工作条件的限制,我无法实现数据库更改,并且试图通过编码解决方案进行尝试。

对这个问题我已经想出了,我认为一个解决方案花了一些时间在周末后,简化了代码一点,即使它仍然是隔靴搔痒完美。

我提取的功能出到一个新的方法并传递我要链接到新策略的主策略英寸

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; 
} 

这让我然后遍历所有的政策和传递需要,只要政策正确的顺序......这在我的情况是开始日期和排序要链接的政策然后通过主策略ID。

Policy newPolicy = null; 
foreach(Policy policy in policyList) 
{ 
    Policy masterPolicy = policy.MasterPolicyId.HasValue ? newPolicy : null; 
    newPolicy = Convert(policy, masterPolicy); 

} 

当一切都说过和做过,这是不是所有的更少的代码,但我相信它更可以理解的,它允许转换单个策略。

2

你正在使用什么样的数据库模式?通常,这是关系应该存储的地方,我认为这应该在数据处理级而不是代码上。

这里是一个非常简单的建议

保险(< insurance_id>,名称,描述)

insurance_item(< ITEM_ID>,< insurance_id>,名称,描述)

insurance_item_details(< ITEM_ID> ,< policy_id>,when_changed)

insurance__policy具有1对多的关系无线th insurance_item。 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大师(unfortnately),但所有你需要做的是插入到insurance_item_details表,而不是进行复印。从它看起来的方式来看,像我最初的例子那样制作副本似乎违反了2NF,我想。

+0

不幸的是,我不知道太多的SQL或非常关于数据库模式......我不会允许即使我想改变它。我强烈地感觉这会更好地处理其他地方...我只是不知道在哪里... – mezoid 2009-09-11 06:36:56

+1

恕我直言,这个问题是在实体关系的领域。你可以在代码方面做到这一点,但我想不出一个你已有的解决方案。 这就是为什么对于一个数据密集型应用程序,得到正确的架构,并从那时起会更容易 Extrakun 2009-09-11 07:16:25

0

如果你有一个糟糕的代码设计,你需要做出改变,你会重构?那你为什么不考虑重构一个错误的数据库设计?这是通过良好的设计在数据库中处理更多的东西。

如果您在保险业是数据密集型工作,你不强的数据库设计和查询能力,我建议你使它成为一个优先变成这样。

+0

是的,我知道。不幸的是现实很复杂。我已经要求在今年进行更多的数据库培训......但是对于重构一个错误的数据库设计,我被告知'不可以对数据库进行任何修改。停止捆绑让事情变得更好,并完成工作。“虽然我很乐意......因为没有任何技能的人给我任何支持来调查可能性,所以我不能这样做...... – mezoid 2009-09-13 03:14:22

+0

这听起来不像是一个很好的工作环境。祝你好运!为数据库做基本的ENF并不难。 – Extrakun 2009-09-14 04:36:47