복합키 순서의 의미 0 3 947

by dbwlqgkq [DB 모델링/설계] [2019.10.13 13:17:32]


안녕하세요

복합키 순서는 크게 상관이 없나요?

마스터 테이블과 마스터 상세 테이블이 있고 마스터 테이블의 pk 가 master_no 일때

마스터 상세 테이블의 pk 가 master_no, master_detail_no 이거나 master_detail_no, master_no 인 경우가 있더라구요

 

1. pk 순서가 달라도 데이터로 봤을때는 크게 의미의 차이가 없는지 궁금합니다

2. master_detail_no, master_no 순서로 pk 를 잡았을때 얻는 이점이 무엇인지요?

종속관계 테이블에서 master_no, master_detail_no 순서로 pk 가 잡히는게 자연스러운 것 같은데 특별한 이유가 있나요?

3. 마스터 상세 테이블에서 master_detail_no, master_no 으로 pk 가 구성된 경우가 있고 master_detail_no 만 pk 로 잡고 master_no 는 fk로 내려서 사용하는 경우도 있던데 이것도 특별한 이유가 있을까요?

 

 

 

 

 

by jkson [2019.10.14 08:40:26]

1.pk와 함께 pk index 생성되므로 유의미합니다.
2.데이터 구성에 따라 달라지겠지만 master_no보다 master_detail_no로 검색하는 경우가 많다면 master_detail_no가 선두컬럼이 되므로 별도의 인덱스를 따로 만들지 않아도 되겠지요.
3.master_detail_no로만 pk로 잡을 수 있다는 것은 master_detail_no만으로도 유일한 데이터 검색이 가능하다는 것이니 굳이 master_no를 pk 컬럼으로 잡을 필요가 없는 것이고 더욱이 데이터 검색시 master_no의 역할이 미미하다면 굳이 pk 컬럼으로 추가하지 않아도 괜찮을 것 같네요. 데이터 정합성을 위해 master_no는 다른 테이블 pk로 지정되어있다면 fk로 데이터 정합성을 유지할 수 있을 것이고요.


by hellodb [2019.10.15 23:41:19]

답변 감사드립니다

3번과 관련해서 궁금한 것이 있습니다

종속관계에서 그렇게 한다고 해도 별 문제 없는 것인가요?


by jkson [2019.10.16 07:43:40]

마스터번호 안에 디테일번호가 종속되는 관계를 말씀하시는 거죠?

단순 마스터-디테일 관계일 때는 마스터번호-디테일번호가 PK가 될 수 있겠지만

쿼리에서 디테일번호로만 데이터 식별이 가능하고 마스터번호 없이 디테일번호로 조인이 더 많이 일어날 수 있는 경우 위의 방법도 괜찮다고 생각해요.

예를들어

진료-처방이라는 엔터티에서

진료 테이블은 키가 진료번호이고

처방테이블은 진료번호, 처방번호로

키를 만들 수 있는 상황에서

처방테이블에 종속되는 테이블이 여러개라고 해보죠.

처방-주사스케줄

처방-수술스케줄

처방-검사상세 등으로요.

종속된 테이블들의 키는 처방키와 각 테이블의 디테일번호가 키가 되고 굳이 진료번호는 속성으로 가져갈 필요가 없다면

처방테이블의 키를 (진료번호, 처방번호) 복합키로 하면 비효율적입니다.

처방번호와 기타 테이블이 조인될 때 처방번호만으로 조인되기 때문에 처방번호 인덱스를 별도로 또 만들어야 하기 때문이죠.

(처방번호, 진료번호)로 키를 만들 수도 있겠으나

처방번호만으로 식별이 가능한데 진료번호를 굳이 PK컬럼으로 추가하면

논리적으로 종속 되는 테이블들도 진료번호를 키로 다 가져가야하고

조인시 불필요한 진료번호까지 조인조건으로 기술해야겠지요.

그럼 처방테이블과 진료 테이블 조인시 진료번호에 인덱스가 있어야 할텐데요.

말씀대로 처방테이블 진료번호 컬럼을 FK로 만들면 해당 컬럼에 인덱스가 생성됩니다.

FK만 설정되고 인덱스가 없다면 마스터 데이터 수정, 삭제시 종속된 데이터에

인덱스를 통해 접근할 수 없게 되어 성능저하는 물론 데이터 LOCK문제가 발생하기 때문에

FK컬럼은 항상 인덱스 생성합니다.

그러나 실무에서 ERD에 FK가 있더라도 FK를 만드는 걸 본 적은 없네요. 그냥 인덱스 하나 만들고 말지요.

아마도 FK생성시 관리의 어려움 때문에 DBA 도 싫어하고 개발자도 싫어해서 그런가봐요ㅎㅎ

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입