Database 如何轻松地将数据库中的记录链接在一起?
我有一个要求,我相信在世界各地一定会经常出现。我有两个链接在一起的记录,每当对它们进行更改时,将创建一对新记录并保留相同的链接 我正在研究的要求与保险业有关,保险业要求我停用当前的保险单,并在新的一行中重新激活它们,以显示对保险单所做更改的历史记录。当它们被重新创建时,它们仍然需要链接在一起 此过程如何从数据库中的行视图工作的示例: 保险Id、保险类型、主保险Id、状态 1,汽车保险,空,激活 2,挡风玻璃保险,1,有效 请注意,在上文中,这些保单之间的链接是如何由指向第一行保险Id的第二行主保险Id表示的 在我编写的代码中,我一次处理一个策略,因此在第一步之后,我有以下内容: 1,汽车保险,空,不活动 2,挡风玻璃保险,1,有效 3,汽车保险,空,激活 当我处理第二个策略时,我得到以下信息: 1,汽车保险,无效,无效 2,挡风玻璃保险,1,不活动 3,汽车保险,无效,有效 4,挡风玻璃保险,1,活动//需要为3而不是1 您会注意到,当我创建新的窗口保险时,由于我们复制了旧的行,所以最终主Id保险指向非活动行 为了解决这个问题,我必须跟踪之前处理的保单的主保险id,该id导致以下代码:Database 如何轻松地将数据库中的记录链接在一起?,database,c#-3.0,Database,C# 3.0,我有一个要求,我相信在世界各地一定会经常出现。我有两个链接在一起的记录,每当对它们进行更改时,将创建一对新记录并保留相同的链接 我正在研究的要求与保险业有关,保险业要求我停用当前的保险单,并在新的一行中重新激活它们,以显示对保险单所做更改的历史记录。当它们被重新创建时,它们仍然需要链接在一起 此过程如何从数据库中的行视图工作的示例: 保险Id、保险类型、主保险Id、状态 1,汽车保险,空,激活 2,挡风玻璃保险,1,有效 请注意,在上文中,这些保单之间的链接是如何由指向第一行保险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);
}
有人知道如何简化吗?确保两条记录保持相互链接的最佳方法是什么,即使记录的每次更改都记录了更改的历史记录?您使用的是哪种数据库模式?通常,这是关系应该存储的地方,我认为应该在数据处理级别而不是代码级别进行处理 这里有一个非常简单的建议 保险(
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并不难。