본문 바로가기

데이터 Story/모델링 이론

이력 데이터와 내역 데이터 2

그럼 [그림5] 환율 엔터티는 내역 엔터티일까요? 이력 데이터일까요? 환율은 기준 통화에 대한 상대 통화의 교환 비율인데요. 기본적으로 매일 관리하기 때문에 기준일자를 관리합니다. 원화에 대한 달러의 2 15일 환율 데이터가 생성되고, 16일 환율도 생성되는 등 주 식별자에 따라 데이터가 생성되니 내역 데이터입니다.

 

환율을 관리하는 원천 엔터티이니 발생 내역 엔터티입니다. 환율 같은 엔터티를 이력 엔터티로 생각하는 경우가 많습니다.


 

[그림5]

 

이미 존재하는 15일 환율이 바뀌고, 바뀌기 전 데이터를 관리해야 한다면 [그림6]과 같이 이력 엔터티가 있어야 됩니다.


 

[그림6]

 

그리고 또 많이 혼돈하는 엔터티가 학력이나 회사경력 같은 엔터티입니다. [그림7]과 같은 고객의 학력을 관리하는 엔터티는 주 식별자가 고객번호+졸업년도정도입니다.


 

[그림7]

 

고객을 기준으로 본다면 학력이 계속 바뀐 것이므로 이력 데이터가 될테지만, 학력 엔터티의 주 식별자는 고객번호+졸업년도입니다. 고객번호와 졸업년도에 따라 생성되므로 내역 데이터입니다.

 

내역 데이터는 현재 살아 있는 데이터입니다. 주 식별자 데이터를 기준으로 유효한 인스턴스가 살아 있는 데이터입니다. ‘123’ 고객의 1995년을 기준으로 본다면 살아 있는 상태며, 현재도 유효한 상태이므로 내역 데이터입니다.

 

학력 엔터티를 이력 데이터라고 생각하는 경우도 많은데요. 적어도 제가 설명하는 기준으로 학력 엔터티는 원천 데이터를 관리하는 내역 데이터입니다. 아마 학력 엔터티를 이력 엔터티라고 생각하면 이력 데이터를 분간하기 어려울 것입니다.

 

이렇게 과거 히스토리를 관리하는 데이터는 일반적으로 이력 데이터가 발생하지 않습니다. 결과를 관리하기 때문에 변경되는 요건이 발생하지 않습니다. 다만 정정이 발생할 수는 있습니다. 정정에 대해서는 다음에 다시 설명하겠습니다.

 

간혹 원천 데이터와 이력 데이터를 혼합해서 한 엔터티에서 관리하는 예가 있는데요. 나중에 설명하겠지만 이런 방법이 효율적일 때가 있지만 대부분 혼란스럽기 때문에 주의해야 합니다. 데이터 모델은 명료한 게 가장 좋은 거 같습니다. 오해의 소지가 있으면 한 없이 오용할 수 있기 때문에요.

 

[그림8] 모델과 같이 주문 엔터티에서 내역과 이력을 동시에 관리하면 혼란스러워서 바람직하지 않습니다. 위의 [그림1]과 같이 원천 데이터를 먼저 도출한 후에 이력 데이터를 따져야 합니다.


 

[주문]

#고객번호

#상품번호

#변경일시

주문수량

123

A001

2025-02-21 13:25:20

1

123

A001

2025-02-21 17:17:17

2

 

[그림8]

 

주문 엔터티는 보통 위와 같이 내역+이력 데이터를 혼합해서 사용하지 않습니다. 주문 엔터티의 주 식별자는 주문번호가 일반적인데요. 예를 들어 주문 수량이나 배송지를 수정한다고 해서 주문번호를 새로 생성시키지 않습니다. 그렇게 되면 하위의 모든 데이터도 생성해야 되고, 고객에게 전달됐을 고객번호를 다시 전달해야 하고요. 혼란스럽죠. 택배 쪽하고도 커뮤니케이션이 혼란스러울 것입니다.

 

주문번호는 변하지 않고 내용(속성)만 변경하는 것이 명료하다고 생각합니다. 따라서 [그림9]와 같이 이력 데이터를 관리하게 됩니다.

 

 

[주문]

#주문번호

고객번호

상품번호

주문일자

주문수량

100001

123

A001

2025-02-21

2

 

[주문이력]

#주문번호

#변경일시

주문수량

100001

2025-02-21 17:17:17

1

 

[그림9]

 

또한 변경일시를 사용하면 어떤 인스턴스가 원천 데이터, 즉 내역 데이터인지 어떤 인스턴스가 변경 이력 데이터인지 구분해야 합니다. 별도의 속성으로 구별할 수 있지만 직관적이지 않고 대부분 내역으로 생각할 것이므로 오용의 소지가 있습니다. 원천 데이터가 흔들릴 수 있으므로 신중하게 사용해야 합니다.

 

변경된 데이터인지에 대한 판단 기준은 해당 엔터티입니다. 해당 엔터티가 원천 데이터인지를 먼저 판단해야 하고요. 그리고 주 식별자에 종속된 속성이 변경돼야 변경 이력이 됩니다. 새로운 주 식별자 데이터를 발생시키면서 데이터를 쌓는 것은 발생 내역입니다.