태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

 

엔터티에 인스턴스를 생성하는 기준이 되는 속성을 주 식별자로 설계하는 것은 주 식별자를 선택하는 중요한 기준 중의 하나다.

 

인스턴스를 생성하는 기준은 업무 식별자를 의미하기도 한다. 어떤 속성 값이 바뀔 때 새로운 인스턴스를 추가해야 하는지를 나타낸다. 어떤 값이 바뀔 때 인스턴스를 하나 추가하는지를 따져 해당 속성을 주 식별자로 선택한다.

 

만약 부서를 관리하는 사원을 별도의 엔터티에서 관리할 때, 부서번호가 다를 때마다 인스턴스가 입력된다면 아래 엔터티와 같이 주 식별자를 선택한다.


[그림1]

 

부서관리사원 엔터티에 인스턴스를 추가해야 할 때는 부서번호 값이 추가될 때다. 만약 ‘100’번 부서번호가 존재한다면 부서관리사원 엔터티에 부서번호가 ‘100’번인 인스턴스를 추가하면 안 된다. 이는 엔터티 간의 관계비를 의미하기도 한다. 특정 부서에는 관리 사원이 한 명만 필요하다는 것을 의미한다.

 

만약 부서관리사원 엔터티에 인스턴스를 추가하는 기준이 부서번호와 사원번호라면, 즉 부서번호 값이 같더라도 사원번호 값이 다르면 인스턴스를 추가할 수 있다면 주 식별자는 아래의 부서관리사원 엔터티와 같다.

 

[그림2]

 

부서번호와 사원번호가 모두 달라야 인스턴스를 생성할 수 있어 주 식별자를 부서번호+사원번호 속성으로 설계한다.

 

인스턴스를 추가하는 기준은 업무 식별자를 의미한다. 엔터티 종류와 무관하게 주 식별자를 정할 때 따져야 하는 기초적이고 중요한 방법이다. 업무 식별자를 고려하고 변경이력 데이터까지 고려해서 주 식별자를 결정하게 된다.

 

업무적으로 인스턴스의 유일성을 보장하는 속성을 주 식별자로 설계하는 것은 모든 엔터티의 주 식별자 설계 원칙이다.



 

 

블로그 이미지

블루퍼필

댓글을 달아 주세요

업무 식별자를 도출할 때는 논리적으로 인스턴스를 구분할 수 있는지로 따진다. 물리적으로 인스턴스를 구분할 수 있는지로 분석하지 않는다.

 

[그림1] 선수소속구단 엔터티는 선수가 소속된 구단을 관리하는 행위 엔터티다.

[그림1]

 

선수는 동시에 여러 구단에 속할 수 있으며, 소속 구단은 매년 변경될 수 있고 기존의 속했던 구단으로 다시 소속될 수 있다. 반대로 구단에도 여러 선수가 속할 수 있다.

 

위와 같은 요건을 만족시키는 업무 식별자는 선수소속구단 엔터티와 같이 선수번호+구단번호+소속일자 속성이다. 즉 선수소속구단 엔터티의 인스턴스는 논리적으로 선수와 구단, 그리고 소속일자에 의해서 구분된다. 선수번호/구단번호/소속일자 속성이 달라야 인스턴스를 생성할 수 있다. 또한 포지션구분코드, 등번호 속성은 선수번호/구단번호/소속일자 속성 세 개에 종속돼 있다. 즉 세 속성이 변경돼야 포지션구분코드 속성과 등번호 속성이 달라진다는 것을 의미한다.

 

만약 위와 같은 업무 요건에 업무 식별자를 사원번호+소속일시 속성으로 도출하더라도 인스턴스를 생성하고 사용하는 데 문제가 없을 수 있다. 하지만 이는 논리적으로 인스턴스를 구분하는 게 아니라 물리적으로 인스턴스를 구분하는 것이다. 이와 같이 물리적으로 인스턴스를 식별하는 대표적인 속성은 일시(일자), 번호, 순번 속성이다.

 

업무 식별자를 도출할 때 일시 속성은 주의해야 한다. 행위 엔터티일 때는 반복되는 행위를 구분하기 위해 일시 속성이 논리적으로 의미가 있는 속성이라 업무 식별자에 포함된다. 이때 주의할 것은 다른 업무 식별자 속성을 도출한 후에 맨 마지막에 일자 속성을 추가하는 것이다.

 

번호 속성은 그 자체로 식별 번호를 의미하므로 주로 실체 엔터티의 인조 식별자가 되며, 필요 시 행위 엔터티도 인조 식별자로 사용할 수 있어 선수소속구단 엔터티의 주 식별자가 번호 속성이 될 수 있다. 하지만 선수소속구단 엔터티의 업무 식별자가 번호 속성이 될 수는 없다.

 

순번 속성은 다른 속성과 함께 사용하는 물리적 속성이라 주의해야 한다. 선수소속구단 엔터티의 업무 식별자를 사원번호+소속순번 등으로 도출하는 것은 의미가 없다. 순번 속성은 사용이 제한적이고 인조 식별자에 포함되기 때문에 업무 식별자에 사용할 수 없다.

 

만약 선수가 구단에 동시에 속할 수 없다는 업무 요건이 있다면 업무 식별자는 아래와 같다.

[그림2]

 

이 경우 논리적인 업무 식별자는 선수와 입단일자가 된다. 따라서 업무 식별자를 사용하는 주 식별자는 선수번호+소속일자로 설계할 수 있다

 

만약 선수가 동시에 여러 구단에 속할 수 없지만, 하루에도 여러 번 구단을 바꿀 수 있다면 업무 식별자는 아래와 같다.

[그림3]

 

하루에도 여러 번 구단을 바꿀 수 있기 때문에 소속일시 속성이 업무 식별자에 포함된다.

 

일시 속성이 주 식별자에 포함되면 불편하기 때문에 일자 속성을 사용한다면, 일자별 여러 구단이 해당될 수 있기 때문에 선수번호+소속일자+구단번호 속성이 업무 식별자가 된다. [그림1] 선수소속구단 엔터티와 업무 식별자가 유사해진다.

 

물리적으로 인스턴스를 구분하는 대표적인 경우는 일시나 타임스탬프, 번호 등의 속성이기 때문에 업무 식별자를 도출할 때는 이런 속성을 주의해야 한다. 데이터 성격 상 이미 인스턴스를 구분하고 식별할 수 있는 위와 같은 속성을 업무 식별자로 설계하면 다른 속성을 업무 식별자로 도출하기 힘들다.

 

업무 식별자를 도출할 때는 논리적으로 따져야 한다. 물리적으로만 도출하면 업무 식별자를 제대로 도출하기 어렵고, 업무 식별자가 불분명하면 엔터티의 성격도 명확하지 않게 된다.

 

블로그 이미지

블루퍼필

댓글을 달아 주세요

실체 엔터티의 주 식별자에는 시각(일자/일시) 속성을 포함시키지 않는다.

 

한 번 생성되면 지속적으로 존재하는 실체의 성격상 실체 엔터티의 주 식별자에는 일자 속성이 포함될 수 없다. 실체의 상태가 변하거나 실체의 특정 속성 값이 변하는 것은 실체가 새롭게 생기는 것이 아니다.

 

[그림1] 장비실체 엔터티는 생산된 장비를 관리하는 엔터티다.

 

[그림1]

 

이에 대한 릴레이션은 아래와 같다.

[장비실체]

#장비아이디

장비명

장비상태유형코드

생산년도

12345

A장비

정상

2045

45678

C장비

정상

2050

78901

B장비

정상

2055

 

[그림2]

 

장비가 생산되면 장비실체 릴레이션에 하나의 인스턴스로 관리된다. 만약 ‘A장비를 쓸 수 없서 폐기하면 그 장비는 사라진다. 이때 해당 장비에 대한 장비상태유형코드 속성 값을 폐기로 수정하면 그만이다. 해당 인스턴스를 실제로 삭제하거나 폐기에 대한 인스턴스를 추가하지 않는다. 또한 ‘B장비가 고장난 상태였다가 수리해서 정상이 되더라도 새로운 인스턴스가 추가되지 않는다. 위와 같은 경우를 아래와 유사한 릴레이션으로 설계했다면 잘못된 설계다.

 

[장비실체]

#장비아이디

#기준일자

장비명

장비상태유형코드

생산년도

12345

2045-02-05

A장비

정상

2045

45678

2050-12-25

C장비

정상

2050

78901

2055-06-06

B장비

정상

2055

78901

2060-03-30

B장비

정상

2055

12345

2055-02-05

A장비

폐기

2045

 

[그림3]

 

위 릴레이션은 기준일자 속성이 주 식별자에 추가돼서 하나의 장비가 마치 두 번 제작된 것 같이 설계된 릴레이션이다. 이는 한 번만 생성되는 실체 데이터로는 부적절하다. [그림4] 릴레이션과 같이 한 번만 생성되고(인스턴스가 하나만 존재하고) 장비상태유형코드 속성 값을 수정하도록 설계해야 한다.

 

[장비실체]

#장비아이디

장비명

장비상태유형코드

생산년도

12345

A장비

폐기

2045

45678

C장비

정상

2050

78901

B장비

고장

2055

 

[그림4]

 

만약 언제 고장나고 언제 폐기했는지 등과 같은 데이터를 알아야 한다면 다른 엔터티에서 관리해야 한다. 실체 엔터티에는 하나의 실체로 존재하고, 실체가 한 행위는 다른 데이터로 관리해야 실체 엔터티의 주 식별자에 일자 속성이 추가되지 않는다.

 

한 번 존재한 실체 데이터는 지속적으로 존재해야 하므로 실체 엔터티의 주 식별자에는 일자 속성이 존재할 수 없다. 실체 엔터티에 존재하는 인스턴스 개수는 실제 실체의 개수와 일치해야 한다.

 


블로그 이미지

블루퍼필

댓글을 달아 주세요

지금 정리하고 있는 모델링 매뉴얼이 책으로 나올지는 모르겠습니다.

어쨌든 이번 매뉴얼 책은 이전 두 책(관계형 데이터 모델링 프리미엄 가이드, 관계형 데이터 모델링 노트)과 성격이 다릅니다.

이런 경우에는 이렇게 설계하라는, 일종의 패턴을 설명한 책입니다.

 

개인적으로 사실 모델링 패턴 책을 좋아하지 않습니다.

데이터 모델링은 상황에 따라 판단해야 하기 때문에 기계가 판단하는 것과 같은 패턴이 있을 수 없다고 생각해서요.

그래서 주변에서 매뉴얼 비슷한 책을 쓰길 권유 받을 때마다 쓰고 싶은 욕구를 접곤 했습니다.

 

하지만 언젠가 문득 더 늦기 전에 정리해야겠다는 생각이 들었어요.

모두가 데이터를 소리 높여 강조하고 데이터 무결성이 중요하다고 말하지만, 그 뿌리인 데이터 모델에는 신경을 쓰지 않습니다.

시간이 지나면 전문 모델러가 더 많아질 줄 알았는데, 언제나 그대로인 거 같아요.

더 악화되기 전에 다소간의 부작용이 있더라도 매뉴얼을 만들어야겠다는 생각을 했습니다.

 

모델링 매뉴얼을 소개하는 이유는 쉽게 따라할 수 있도록 하기 위해서이기도 하지만, 정확히 설계할 수 있도록 하기 위한 목적이 더욱 큽니다.

개념을 익히고 따라하면 90점에 가까운 모델이 되지 않을까 해서요.

 

물론 일부 내용은 개인적으로 사용하기 위해 만든 것이기 때문에 작위적일 수 있습니다.

하지만 쉬우면서도 정확하게 설계하는 데 도움이 되길 바라면서 추가했습니다.

 

어떤 식으로든 90점에 가까운 모델이 되기 위해 쓰였으면 좋겠습니다. 대충이 아니라 제대로를 추구했으면 좋겠고, 그런 모델러가 많아졌으면 좋겠습니다.



블로그 이미지

블루퍼필

댓글을 달아 주세요

행위 엔터티의 하위 엔터티가 많지 않다면, 행위 엔터티의 주 식별자를 인조 식별자로 설계하지 않고 업무 식별자로 설계한다.

 

[그림1] 주문 엔터티는 주문이라는 행위를 관리하는 엔터티다.

[그림1]

 

주문 엔터티의 주 식별자는 인조 식별자가 아니라 업무 식별자다. 행위 엔터티는 업무 식별자를 사용하는 것이 원칙이다행위 엔터티의 업무 식별자가 있는데로 불구하고 인조 식별자를 사용하면 엔터티의 정체성이 희석될 수 있다. 인위적인 속성이 추가되는 것 자체가 바람직하지 않다.

 

행위 엔터티의 주 식별자는 업무 식별자이기 때문에 대체로 복잡하다. 만약 행위 엔터티의 하위 엔터티가 상당히 많다면 이때는 업무 식별자를 주 식별자로 사용하지 않고 인조 식별자를 주 식별자로 사용하는 게 바람직하다상위 엔터티의 주 식별자가 복잡하면 하위 엔터티를 복잡하게 만들 수 있으며, 모델이 복잡해져 데이터 관리가 힘들어질 수 있다.

 

[그림1] 주문 엔터티의 하위 엔터티가 많다면 [그림2] 주문 엔터티처럼 인조 식별자를 사용해서 주 식별자를 설계한다.


[그림2]

 

블로그 이미지

블루퍼필

댓글을 달아 주세요