Engineering Note

[Database] 제약조건 공부, 유니크(복합 유니크) 본문

Computer Science/Database

[Database] 제약조건 공부, 유니크(복합 유니크)

Software Engineer Kim 2026. 1. 8. 16:53

복합 유니크 조건를 잘못 사용하면서 놓칠 뻔한 요구사항 반영(하나의 회원은 하나의 장바구니를 가진다. ,미래에는 여러 장바구니를 가질 수 있다.)
+현재의 요구사항과 확장성을 혼동하지 않는 법



유니크제약 조건에 대한 공부. DB를 설계할 때 요구사항을 어떻게 반영할 수 있는지 많은 공부를 했다. 그리고 특정 요구조건이 없더라도 불필요한 중복은 없는지도 스스로 생각해 볼 수 있었다.  상품 카페고리건이그랬다. 상품과 카테고리 정보를 연결해주는 상품카테고리 테이블에서 상품과 카테고리가 중복저장되는 상황을 방지하기 위해 복합 제약조건을 걸었다.

맥북프로라는 상품이 노트북이라는 카테고리에 저장되었는데 다시 노트북이라는 카테고리에 또 저장되는 상황을 막기 위해 세팅해주었다. 맥북프로는 노트북, 컴퓨터, 전자기기 등의 카테고리에 포함될 순 있지만 맥북프로-노트북 연결이 두 번 이상 중복될 필요도 없고 그래서도 안된다. 이러한 사항을 복합 유니크 제약조건으로 해결했다.

또 다른 사항은 단일 제약조건이다. 장바구니와 회원의 관계인데 확장성을 위해 장바구니를 테이블로 분리해 두었지만 현재 기준에서는 여전히 하나의 회원은 하나의 장바구니를 가질 수 있는게 요구조건이기 때문에 확장성을 염두에 두고 테이블은 설계했지만 제약조건은 미래의 상황보다는 현재의 요구조건을 반영하도록 해주었다.

이 상황에서 처음에 헷갈린건 미래상황과 현재 상황 무엇을 우선순위에 두어야 할 지를 결정하는 일이었다. 한 번에 여러가지 일을 생각할 수는 없다. 현재의 상황을 생각하자. 두 테이블의 현재 관계는 일대일이었고 그 상황에서 다시 제약조건을 생각해야 했다.

일대일 상황에서 이 일대일 상황이 잘 지켜지기 위해서는 cartid와 memberid를 동시에 pk로 잡을 수도 있지만 memberid를 fk로 두고 unique 조건을 설정해주었다.

이렇게 되면 미래에 확장성이 생겼을 때 유니크 조건만 제거해주면 된다.

맨 처음 잘못생각한던 여기도 복합 유니크 조건을 설정하려고 한 점임데 복합 유니크는 1,1이 하나만 존재할 수 있다는 의미다. 그런데 두 필드 cartid, memberid를 복합유니크로 설정하면 복합 유니크 조건은 잘 동작하더라도 이게 하나의 회원이 하나의 장바구니를 갖는다는 요구조건를 막아주지는 못한다. (cartid,memberid)로 저장될 때

(1,2) (2,2) (3,2) 이렇게 2번 회원이 여러개의

장바구니를 가질 수 있는 구조가 된다. 복합 유니크는 (1,2)라는 데이터가 중복되는걸 막아주는 제약조건이니까.

즉 Cart테이블의 하나의 회원만 저장되도록 하는게 하나의 회원은 하나의 장바구니만 갖는다는 요구조건 만족시켜줄 수 있고 그건 memberid는 이 테이블에서 유니크하다는 조건을 위해 memberid에만 걸어주면된다.

Comments