어떻게 쉽게 기록을 유지하는 데이터베이스에 연결되어 함께?

StackOverflow https://stackoverflow.com/questions/1409206

  •  05-07-2019
  •  | 
  •  

문제

는데 필요하다고 믿는 발생해야 합니다 매우 자주 around the world.나는 두 레코드를 함께 연결할 때마다 변경되었을 그들에게 새로운 쌍의 기록을 만들고 유지하는 동일한 링크입니다.

의 요구 사항에 함께 할 수 있는 보험 산업 필요성을 현재보험 다시 활성화에 새로운 행을 보여주기 위해 변경 내역 보험 정책입니다.때 그들은 다시 만들어 그들은 여전히 할 필요가 함께 연결되어 있습니다.

예를 들어의 이런 과정이 어떻게 작동하기위한 뷰에서 데이터베이스에서 행:

보험 Id,보험,유형,마스터는 보험 Id,상태

1,자동차 보험,null,활성

2 개,바람의 화면 보험,1,활성

참고로 위의 방법이 사이의 링크를 이러한 정책으로 표시는 마스터 보험 Id 의 두 번째 행을 가리키는 보험 Id 로 최초의 행이 있습니다.

에 코드를 쓰고 나는 처리는 각각의 정책을 한 번에 한 후 그래서 첫 번째 단계는 다음과 같다:

1,자동차 보험,null, 비활성화

2 개,바람의 화면 보험,1,활성

3,자동차 보험,null, 활성

때 나는 프로세스에 두 번째 정책을 얻을 다음과 같다:

1,자동차 보험,null,비활성 상태

2 개,바람의 화면 보험,1, 비활성화

3,자동차 보험,null,활성

4,풍 화면 보험, 1, Active//해야 3 지 않 1

면서 내가 만드는 새로운 창이 보험 때문에 우리는 우리로 복사가 이전 행 우리는 결국 마스터 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);

}

는 방법을 아는 사람이 간소화할 수 있습니다?무엇이 가장 좋은 방법은 두 개의 기록을 유지됩니다 서로 연결하는 심지어 역사로의 변경은 기록을 위해 각 변경한 기록이 있는가?

도움이 되었습니까?

해결책 3

주셔서 감사합니다 모두가 제공되는 답변이 있습니다.불행하게도 때문에 조건에서 작동을 구현하는 데이터베이스의 변화와 이를 만들려고 노력으로 코딩 솔루션입니다.

후에는 시간을 보내는 주말에서 이 문제가 해결책에 내가 믿는 간단 코드를 조금도 그것은 여전히 거의 완벽 어디에도 없습니다.

추출 기능을 밖으로는 새로운 방법과 전달 마스터는 정책이 내가 원하는 새로운 정책 연결을 시도합니다.

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

}

을 때 그리고 모든 것,그렇지 않은 모든 것을 훨씬 적은 코드 그러나 나는 그것을 믿는 것은 훨씬 더 많은 이해하고 그것을 허용 개별적인 정책을 반환합니다.

다른 팁

어떤 종류의 데이터베이스에 스키마을 사용하고 있습니까?일반적으로,이것은 어디의 관계를 저장되어야 하고 나는 생각이 있어야 hanlded 에서 데이터 처리 수준보다는 코드입니다.

여기에 매우 간체 추천

보험(< insurance_id>,이름,설명)

insurance_item(< 레이더 크루즈>, < insurance_id>,이름,설명)

insurance_item_details(< 레이더 크루즈>, < policy_id>,when_changed)

보험__사항 1 많은 관 insurance_item.보험__항목이 있을 많은 관 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,나는 생각한다.

당신이 잘못된 코드 디자인 그리고 당신을 만드는 데 필요한 변경을 리팩터링?왜 당신은 고려하지 않 refactoring 나쁜 데이터베이스 디자인?이것은 무언가를 더 ealisy 처리를 통해 데이터베이스에 좋은 디자인합니다.

에서 작업하는 경우에는 보험 산업에 있는 데이터가 집중 그리고 당신은에서 강한 데이터베이스의 디자인과 기술을 쿼리,나는 당신을 제안 우선 순위가 되도록.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top