본문 바로가기

데이터 Story/모델링 이론

이력 데이터와 내역 데이터 1

지난 글에서 이력 데이터의 성격에 대해 간략하게 설명드렸습니다. 다시 정리하면 변경되는 데이터가 이력 데이터이고요. 쌓이는 데이터는 내역 데이터입니다.

 

그리고 원천(본질) 데이터인지를 구별하는 것이 중요합니다. 원천 엔터티를 도출하고 이력엔터티를 분석해야 하고요. 발생 내역인 원천 데이터가 변경되면, 변경 전의 데이터를 관리해야 이력 데이터 관리라고 합니다.

 

저는 변경이력발생내역이라는 용어로 구분합니다. 지난 번에 언급했듯이 이력이라는 용어는 상당히 애매합니다. 과거 데이터라는 포괄적인 의미를 지니고 있습니다. 영어로 표현하면 Time-Dependent Data, Historical Data 정도가 되는데요

 

하지만 데이터 모델에서 말하는 이력은 단순히 쌓여있는 과거의 데이터가 아니라 변경된 과거 데이터입니다. 과거 데이터라도 본질(원천) 데이터일 수 있습니다. 죽어 있는 데이터가 우리가 말하는 이력 데이터입니다.

 

제가 두어 명에게 이 내용을 설명했는데 이해시키는 데 실패했습니다. 그래서 책에서도, 블로그에서도 반복적으로 쓰고 있습니다. ㅎㅎ

 

다양한 예제로 설명하겠습니다.

 

[그림1]은 단골로 출연하는 주문 엔터티입니다. 같은 상품은 하루에 한 번만 주문할 수 있다고 가정하겠습니다. 이 엔터티의 주 식별자는 고객번호+상품번호+주문일자입니다. 주 식별자는 인스턴스를 생성하는 기준이 됩니다. 따라서 이 주 식별자대로 데이터가 생성되는 내역 데이터입니다. 그다지 따지지 않아도 원천 엔터티라는 것을 알 수 있습니다.


 

[그림1]

 

간혹 해당 주 식별자(고객번호+상품번호+주문일자)가 아닌 고객번호 속성 하나에 대한 종속성을 기준으로 상품번호와 주문일자가 바뀌므로 이력이라고 확대 해석하는 경우가 있습니다. 임의의 속성이 종속성을 판단하는 기준이 아니라 해당 주 식별자가 기준이 됩니다. 해당 엔터티가 분석 대상입니다.

 

따라서 주문 엔터티에 인스턴스가 발생되는 것은 내역 데이터입니다. 만약 이 주 식별자에 종속된 속성 값이 바뀌면 이력 데이터가 됩니다. 즉 주문수량이 변경되면 이력 데이터에 대한 고민을 하게 됩니다.

 

업무가 변경돼서 하루에 같은 상품을 여러 개 주문할 수 있다고 가정하면요. ‘123’ 고객이 2025 2 21일 주문한 ‘A001’ 상품을 몇 시간 후에 하나 더 추가하는 것으로 주문을 변경했다면 주문 엔터티의 주문수량 데이터를 ‘2’로 변경해야 됩니다.

 

이때 기존에 ‘1’이었던 데이터를 관리해야 하면 이력 데이터를 관리하는 것입니다. 그냥 ‘2’로 업데이트하고 끝이라면 이력 데이터는 관리하지 않는 것입니다. 아래의 주문이력 엔터티는 불필요합니다.

 

이력 데이터를 관리할 때는 [그림2]와 같습니다.


 

[주문]

#고객번호

#상품번호

#주문일자

주문수량

123

A001

2025-02-21

2

 

[주문이력]

#고객번호

#상품번호

#주문일자

#변경일시

주문수량

123

A001

2025-02-21

2025-02-21 13:25:20

1

 

[그림2]

 

[그림3] 왼쪽 모델에서 상품 가격은 기본적으로 상품 엔터티와 일대일 관계입니다. 더 정확하게 얘기하면 상품번호를 알면 유일하게 하나의 가격이 정해지는, 상품번호에 종속된 속성입니다.

 

주 식별자인 상품번호 속성에 종속된 상품가격 속성 값이 변경되면 이력 데이터가 생깁니다. 오른쪽 모델과 같습니다.

 

    

[그림3]

 

만약 매일 변할 수 있는 상품 가격을 관리하겠다라는 요건이 있다면 [그림4]와 같은 상품가격 엔터티가 필요합니다. 이 엔터티의 주 식별자는 상품번호+기준일자정도가 됩니다. 상품 엔터티에는 상품가격 속성이 없고, 주 식별자에 유니크하게 상품가격 엔터티에 데이터가 생성되므로 내역 데이터가 됩니다. 상품 가격을 관리하는 원천 엔터티가 됩니다.


 

[그림4]