본문 바로가기

데이터 Story/모델링 이론

이력 엔터티를 설계하는 10가지 방법 – 서론

이력 데이터에 대한 글을 계속 올리고 있는데요. 개요적인 내용은 소개했으니 다른 주제(식별자)로 넘어갈까를 좀 고민했습니다. 느끼신 분들이 있겠지만 엔터티나 관계 등과 같이요.

 

개인적으로 제가 책을 쓰면서 다른 책과 차별되도록 구성한 장이 정규화와 통합, 이력, 방법론 입니다. 얼마 전에 메일을 한통 받았는데 거의 정확하게 맞추신 분이 있습니다. 각 장의 특징을 조만간 올릴 생각입니다. 군더더기라 생각해서 책에는 생략을 했는데요.

 

이력 데이터 관리가 전략적인 장이라서 당분간 이력 엔터티 위주로 글을 올리겠습니다. 오늘은 이력 데이터를 관리할 수 있는 10가지 방법의 개략에 대해 쓰려고 합니다.

 

10가지 방법은 실무에서 자주 사용하는 방법을 제 나름대로 구분한 것인데요. 사실 내역 데이터 설계 방법까지 일부 포함돼 있습니다. 이력과 내역은 데이터의 성격이 아니라 엔터티의 설계 형태에 따라 구분되기도 합니다.

우선, 크게 3가지로 구분할 수 있습니다.

 

엔터티의 속성 중에서 하나라도 변경되면 변경 전의 전체 인스턴스를 그대로 관리하는 방법과 변경된 속성만을 개별적으로 관리하는 방법. 그리고 유사한 성격의 속성을 묶어서 관리하는 방법이 있습니다.

 

인스턴스를 통째로 쌓는 방법은 다른 방법에 비해 저장 공간의 낭비가 심합니다. 비록 특수 목적을 위한 것이지만 중복이 심하고요.

 

저장하기 쉽고 해당 시점의 전체 데이터, 즉 변경된 속성의 데이터와 변경되지 않은 속성의 데이터를 한 번의 액세스로 조회하기 쉽다는 강력한 장점이 있습니다. 하지만 어떤 속성 값이 변경됐는지 알기 어려워 변경된 속성의 데이터만을 조회하기는 쉽지 않습니다.

 

변경된 속성의 데이터만을 관리하는 방법은 저장 공간이 가장 절약됩니다. 또한 변경된 속성만을 대상으로 관리하므로 변경된 속성이 무엇인지 명확하게 알 수 있습니다.

 

반면에 변경된 속성의 데이터와 변경되지 않은 속성의 데이터를 같이 조회하기는 쉽지 않습니다. 인스턴스로 쌓는 방법과 장·단점이 대체로 반대입니다.

 

마지막으로 속성 중 내용(도메인)이 유사하거나 같이 사용될 수 있는 속성만으로 별도의 엔터티를 만들어서 해당 속성 중의 하나라도 변경되면 그 시점의 데이터 인스턴스를 스냅샷으로 관리하는 방법이 있습니다.

 

인스턴스로 관리하는 방법과 개별 속성으로 관리하는 방법의 장점을 수용한 방식으로 적절하게 사용하면 양쪽의 장점을 살리는 것이 되겠지만 잘못 사용되면 단점만을 수용하게 될 수도 있습니다.

 

유사한 성격의 이력 데이터가 하나의 엔터티에서 관리되므로 엔터티의 성격이 분명해지는 장점도 있어 요건에 따라서는 가장 효율적인 방법입니다.

 

이상이 이력 데이터를 관리는 커다란 3가지 방법이고요. 다음부터 상세하게 10가지로 나눠 설명하겠습니다. 시리즈 비슷하게요.

 

그리고 나중에도 언급하겠지만 이력 데이터를 관리하는 방법을 하나로 획일화하려는 경향이 있습니다. 모든 이력 데이터를 스냅샷 방법으로 처리한다거나 개별 속성으로 관리한다고 정하는 것은 전혀 바람직하지 않습니다. 엔터티의 성격과 요건, 중요도에 맞춰 적절한 방법을 사용해야 합니다.

 

이력 데이터에 대한 요건은 현재도 단순하지 않지만 앞으로 더욱 복잡해지고 어려워질 것이므로 요건에 가장 합당한 방법을 채택할 수 있는 힘을 길러야 합니다. 이런 힘을 길르는 데 초점을 맞춰 10가지 방법을 고민해보면 좋을 거 같습니다.