아래 테이블과 설계하고자 하는 히스토리를 함께 말씀드립니다..
EQP_NAME | PARAM | CHAR_NO | USE_YN |
ABCD | 가나다 | 100 | Y |
ABCD | 라마바 | 101 | Y |
EFG | 가나다 | 100 | Y |
EFG | 라마바 | 101 | Y |
위와 같은 테이블이 있습니다. EQP_NAME, PARAM은 PK 이고, EQP_NAME과 CHAR_NO는 UK로 잡혀있습니다.
그런데 현장에서 2번 행의 [라마바] 를 [아자차카] 로 변경하였고 명칭만 바뀐 것이기에 설비 특성인 CHAR_NO 는 똑같이 가져가면서 PARAM [아자차카] 로 변경하려고 합니다.
하지만 해당 ROW가 PK 이기에 [ABCD, 라마바, 101, Y] 행에서 USE_YN(사용여부) 컬럼을 N 으로 바꾸고 [ABCD, 아자차카, 101, Y]를 추가하려고 합니다. 이 경우에는 UK가 문제가 되어 UK를 [EQP_NAME, PARAM, USE_YN] 3 가지로 선택하고자 했습니다. 이 경우에 [ABCD, 아자차카, 101, Y] 은 정상적으로 추가가 될 것 같습니다.
하지만, 이후 시간이 또 지나 [ABCD, 아자차카, 101, Y] PARAM 명칭이 또 바뀌어 해당 행의 USE_YN을 N 처리 하려고 하면 UK 제약조건에 걸리게 됩니다.
따라서 생각한 방법이 Y는 하나만 있되, N은 복수를 허용하는 방법을 생각했습니다. (Unique 제약 조건을 푸는 것은 불가합니다.)
EQP_NAME, PARAM이 PK이지만 PARAM이 변경될 가능성이 있는 컬럼이라 현재 상태로는 변경 전 데이터와 변경 후 데이터가 PK로 관리되기 어려워 보이네요.
그리고 EQP_NAME과 CHAR_NO가 꼭 UK로 관리되어야 하는지도 검토해봐야할 것 같습니다.
말씀하신 내용만 보면 EQP_NAME, CHAR_NO UK를 없애고 EQP_NAME, CHAR_NO 그리고 추가로 SEQ라는 컬럼을 두어 이 세 컬럼을 PK로 두는 게 어떨까요?
이렇게 PK를 지정한다면
EQP_NAME/CHAR_NO/SEQ/PARAM/USE_YN
ABCD 101 1 라마바 Y
->
ABCD 101 1 라마바 N
ABCD 101 2 아자차카 Y
이런 형태로 데이터가 관리되어야 할 것 같습니다.
보통은 이런 경우 ABCD 101 1의 USE_YN을 N으로 업데이트하고 ABCD 101 2 Y 데이터를 인서트하는 두 명령을 한 트랜잭션에서 처리합니다.