이러한 상황에서는 복합키와 대리키 중 어느것을 사용해야 하나요?
725
작성한 질문수 24
안녕하세요 현재 한 사용자가 한 상점에 대해서 특정 유형의 주문을 몇 번 했는지 조회하는 기능을 구현하고 있습니다.
처음에는 주문 테이블의 모든 튜플을 조회하면서 shopid, userid, orderType이 일치하는 경우 값을 누적하는 방식으로 구현을 했는데요,
테이블이 갈수록 커지고 이러한 조회가 기획 상 굉장히 빈번하기 때문에 한 유저가 한 상점에 대해 특정 유형의 주문을 몇번 했는지 기억하는 별도의 테이블을 생성하기로 하였습니다.
테이블은 userId, shopId, reservationCount, pickupCount, noShowCount 를 필드로 갖도록 구현했습니다.
그런데 여기서 기본키를 설정해야 하는데 저는 userId, shopId를 복합키로 하는 것이 좋다고 생각했습니다. 그 이유는 이러한 통계성 테이블이 join을 하는 상황이 없고, 한 유저가 특정 샵을 처음 이용할 때만 튜플이 생기고 이후에는 필드 값만 변경이 이루어지며, 조회가 매우 빈번하기 때문에 userId, shopId를 기본키로 하여 인덱싱을 활용하면 좋다고 생각했기 때문입니다.
근데 강사님이 설명하시기를 실무에서는 복합키를 거의 사용하지 않는다고 말씀해주셨는데 이러한 상황에서도 그냥 대리키를 쓰는 것이 낫나요?
복합키를 활용한 인덱싱 vs 대리키 + shopId, userId 추가 인덱싱
이 둘 중 하나를 적용할 거 같은데 무엇을 기준으로 어떻게 판단해야 할 지 잘 모르겠습니다. 도움 주시면 감사하겠습니다.
참고로 db는 mysql사용중입니다.
답변 1
0
안녕하세요, 인프런 AI 인턴이에요. 주문 정보와 통계 정보를 저장하는 테이블에 기본키를 설정해야 하는데, userId와 shopId를 기본키로 사용하는 것이 좋을까요?
실무에서는 주로 대리키를 사용하고, 복합키는 거의 사용하지 않는 경향이 있습니다. 복합키를 사용하면 성능과 유지보수 측면에서 일부 문제가 발생할 수 있기 때문입니다. 대리키를 사용하면 각각의 행에 고유한 식별자를 부여할 수 있으므로 중복되는 데이터를 효과적으로 처리할 수 있습니다. 또한, 나중에 다른 필드를 기준으로 조회하거나 조인할 때도 편리합니다.
따라서 별도로 생성한 복합키 대신 대리키를 사용하는 것이 좋을 것 같습니다. 대리키로는 일련번호, 고유 해시 값을 사용할 수 있으며, 데이터베이스 시스템이 자동으로 관리하는 자동증가(Auto Increment) 기능을 활용할 수도 있습니다. 이렇게 대리키를 사용하면 빈번한 조회와 인덱스 활용에도 더욱 효율적으로 처리할 수 있을 것입니다.
더 궁금하신 사항이 있으시다면, 언제든지 질문해주세요. 좋은 결과 있으시길 바랄게요!
inheritance startegy 선택시 고려사항
0
11
0
Entity 동등성 비교
0
14
1
실무 조언 관련 질문입니다.
0
42
1
H2데이터베이스 파일 생성
0
52
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
49
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
48
1
JPQL 메소드와 락
0
53
1
Delivery @OneToOne
0
57
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
89
2
UnsupportedOperationException 발생
0
82
3
H2 Database 연결이 안됩니다.
0
89
2
연관관계 매핑 질문드립니다.
0
82
2
h2데이터베이스 실행오류
0
105
2
persistence.xml
0
103
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
77
1
영속성 컨텍스트
0
62
1
JPA 프록시
0
90
1
Native Query와 MyBatis
0
63
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
84
1
임베디드 타입 예시 코드 관련 질문
0
112
3
명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요
0
91
3
인텔리제이 패키지 커서 단축키 질문
0
106
2
혹시 현재는 ID 데이터 타입이 String이면 안되나요?
0
138
1
양방향 연관관계 시 연관관계 주인을 설정하는 이유
0
68
1





