Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何轻松地将数据库中的记录链接在一起?_Database_C# 3.0 - Fatal编程技术网

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

Database 如何轻松地将数据库中的记录链接在一起?,database,c#-3.0,Database,C# 3.0,我有一个要求,我相信在世界各地一定会经常出现。我有两个链接在一起的记录,每当对它们进行更改时,将创建一对新记录并保留相同的链接 我正在研究的要求与保险业有关,保险业要求我停用当前的保险单,并在新的一行中重新激活它们,以显示对保险单所做更改的历史记录。当它们被重新创建时,它们仍然需要链接在一起 此过程如何从数据库中的行视图工作的示例: 保险Id、保险类型、主保险Id、状态 1,汽车保险,空,激活 2,挡风玻璃保险,1,有效 请注意,在上文中,这些保单之间的链接是如何由指向第一行保险Id的第二行主保

我有一个要求,我相信在世界各地一定会经常出现。我有两个链接在一起的记录,每当对它们进行更改时,将创建一对新记录并保留相同的链接

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

此过程如何从数据库中的行视图工作的示例:

保险Id、保险类型、主保险Id、状态

1,汽车保险,空,激活

2,挡风玻璃保险,1,有效

请注意,在上文中,这些保单之间的链接是如何由指向第一行保险Id的第二行主保险Id表示的

在我编写的代码中,我一次处理一个策略,因此在第一步之后,我有以下内容:

1,汽车保险,空,不活动

2,挡风玻璃保险,1,有效

3,汽车保险,空,激活

当我处理第二个策略时,我得到以下信息:

1,汽车保险,无效,无效

2,挡风玻璃保险,1,不活动

3,汽车保险,无效,有效

4,挡风玻璃保险,1,活动//需要为3而不是1

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

}

有人知道如何简化吗?确保两条记录保持相互链接的最佳方法是什么,即使记录的每次更改都记录了更改的历史记录?

您使用的是哪种数据库模式?通常,这是关系应该存储的地方,我认为应该在数据处理级别而不是代码级别进行处理

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

保险(,名称,描述)

保险项目(,名称,描述)

保险项目详细信息(,变更时)

保险单与保险项目有一对多的关系。保险项目与保险项目详细信息具有一对多关系。保险项目详细信息中的每一行表示保单的更改

通过这种方式,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)

因此,我们的想法是不复制保险项目——您有另一个表来存储将要更改的元素,并使用时间戳将该更改表示为一个关系


我不是SQL专家(不幸的是),但您所需要做的只是插入保险项目详细信息表,而不是复制。从外观上看,像原始示例中那样复制似乎违反了2NF,我认为。

如果您的代码设计不好,需要进行更改,您会重构吗?那么,为什么不考虑重构一个糟糕的数据库设计呢?这是通过良好的设计在数据库中更容易处理的事情


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

感谢所有提供答案的人。不幸的是,由于工作条件的原因,我无法实现数据库更改,并且一直在尝试使用编码解决方案

在周末花了一段时间研究这个问题之后,我想出了一个解决方案,我相信它可以稍微简化代码,尽管它还远远不够完美

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

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

}

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

不幸的是,我不太懂sql,也不太了解数据库模式……即使我想更改,也不允许我更改它。我强烈地感觉这将是更好的处理其他地方…我只是不知道在哪里…嗯,这个问题是在实体关系的领域。您可以在代码方面做到这一点,但除了您已经拥有的解决方案之外,我想不出其他解决方案。这就是为什么对于数据密集型应用程序,正确地完成模式,从那时起会更容易是的,我知道。不幸的是,现实是复杂的。今年我要求接受更多的数据库培训……但是对于重构一个糟糕的数据库设计,我被告知‘不,你不能对数据库做任何更改’。我很想……但我不能,因为没有一个有任何技能的人给我任何支持来调查可能性……这听起来对你来说不是一个好的工作环境。祝你好运为数据库执行基本ENF并不难。