首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何轻松地将记录保存在链接在一起的数据库中?

如何轻松地将记录保存在链接在一起的数据库中?
EN

Stack Overflow用户
提问于 2009-09-11 05:58:12
回答 3查看 157关注 0票数 0

我有一个要求,我认为必须经常发生在世界各地。我有两个连接在一起的记录,每当对它们进行更改时,将创建新的一对记录并保留相同的链接。

我所做的要求与保险业有关,它要求我关闭当前的保险单,并在新的行中重新激活它们,以显示对保险单所做的更改的历史。当它们被重新创建时,它们仍然需要连接在一起。

关于如何从数据库中的行视图中处理此过程的示例:

保险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导致了以下代码:

代码语言:javascript
复制
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);

}

有人知道如何简化这个程序吗?确保两个记录保持联系的最佳方式是什么,即使每次更改记录都记录了更改的历史记录?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-09-14 09:38:01

感谢所有给出答案的人。不幸的是,由于在工作中的条件,我无法实现数据库更改,我只能尝试用编码解决方案来解决问题。

在这个问题上花了一段时间之后,我想出了一个解决方案,我相信它简化了一些代码,尽管它还远远不够完美。

我将该功能提取到一个新方法中,并传入我希望链接到的主策略。

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

代码语言:javascript
复制
Policy newPolicy = null;
foreach(Policy policy in policyList)
{
    Policy masterPolicy = policy.MasterPolicyId.HasValue ? newPolicy : null;
    newPolicy = Convert(policy, masterPolicy);   

}

当所有这些都说了又做了,代码就没有那么少了,但我相信它更容易理解,并且允许转换单个策略。

票数 0
EN

Stack Overflow用户

发布于 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就可以快速检索最新的两个项。

代码语言:javascript
复制
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,我认为。

票数 2
EN

Stack Overflow用户

发布于 2009-09-11 13:22:50

如果您的代码设计很糟糕,并且需要进行更改,您会重构吗?THen为什么不考虑重构一个糟糕的数据库设计?这是通过良好的设计在数据库中处理得更好的东西。

如果您在数据密集型的保险业工作,而且在数据库设计和查询技能方面不强,我建议您将此作为优先事项。

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

https://stackoverflow.com/questions/1409206

复制
相关文章

相似问题

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