inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바 ORM 표준 JPA 프로그래밍 - 기본편

복합키, 대리키 질문

806

GPK

작성한 질문수 12

0

DB 초보, JPA초보라 영한님 강의가 정말 큰 도움이 되고 있습니다.

아래와 같은 DB 구조인데

// 한시간단위 통계
device_data_hourly
	system_id   varchar	PK
	device_id   varchar	PK
	target_date datetime
        yyyymm      varchar	PK
	dd          varchar	PK
	hh          varchar	PK
	data        float

복합키를 생성하기 위해 영한님 JPA 책에서 @IdClass나 @EmbeddedId를 보고 있습니다.

1) 강의에서도 대리키를 강조하셨고, 
인터넷 검색해보니 예전에는 복합키를 매우 많이 썼지만, 요즘은 대리키를 많이 쓰는 추세인 것 같습니다.

위와 같은 경우는 
저렇게 복합키를 생성하면 index도 걸리니까, 별도로 index를 걸 필요도 없어서 괜찮아 보이는데,
JPA 구현상으로는 불필요하게 code가 복잡해지는 것 같습니다.

그냥 대리키를 사용하고 index(system_id, device_id, yyyymm, dd, hh)를 걸어주는게 더 나을까요?

2) 테이블에서 yyyymm, dd, hh, mm 등의 필드를 별도로 분리해서 두는 이유가
   Batch Task 등에서 통계 조회시 group by 등을 할 때 성능 최적화를 위해서 저렇게 하는 것인가요?
   yyyymm, dd 등의 필드가 아니라 target_date(datetime)을 기반으로 값을 추출해서 조회하면 성능이 많이 차이나나요?

3) 위 통계 Table의 target_date 필드의 필요성
   yyyymm, dd, hh, mm 등의 필드가 있는데도 target_date를 별도로 두는 이유는  검색시 날짜 시간 구간 검색 query시 편의를 위해서인가요?

질문을 쓰고 보니, JPA 질문이 아니라 그냥 Database 질문이 되버렸네요. ^^;;

JPA java

답변 3

0

김영한

네 이부분은 정말 case by case인데요^^

꼭 필요하면 이 부분은 역정규화를 하면 됩니다^^!

감사합니다.

0

GPK

답변 감사드립니다.

해당 대리키PK를 다른 테이블에서 외래키로 참조할 때, 
검색시에는 주로 natural key 값 같은 것이 들어오니 대리키값을 바로 검색에 사용할 수가 없고,
2개 테이블을 join해서 검색해야할텐데, (PK가 natural key 라면 join 없이 바로 검색 될테니...)

이런 join에 대한 부담 같은 것은 현업에서는 크게 부담 안되는 수준인가요?
case by case일 수도 있겠습니다만..^^;;

0

김영한

안녕하세요. GPK님^^

1) 네 대리키를 사용하고 unique index를 추가로 걸어주시는 것을 저는 권장합니다.

2) 저는 이렇게 필드를 나누는 부분에 크게 동의하지 않습니다. 물론 데이터베이스 상황에 따라서 더 최적화가 물론 될 수 는 있지만, datetime으로 잡아도 충분히 인덱스가 잘 운용될 수 있습니다.

3) 조회 쿼리를 편리하게 만들려고 이렇게 나누어 둔 것 같습니다.

과거에 이런 방식으로 문자를 가지고 해결하는게 많았는데요. 최근에는 가급적 date, datetime 등등 날짜는 날짜 타입으로도 충분히 문제를 해결할 수 있습니다. 저는 날짜는 날짜로 해결하는게 더 나은 방법이라 생각합니다.

Entity 동등성 비교

0

2

1

실무 조언 관련 질문입니다.

0

41

1

H2데이터베이스 파일 생성

0

51

2

서브쿼리 강의에서 ALL 예시 관련 질문드립니다.

0

49

2

수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?

0

48

1

JPQL 메소드와 락

0

52

1

Delivery @OneToOne

0

57

1

17강 4~5분대 테이블 값 조회가 안됩니다.

0

89

2

UnsupportedOperationException 발생

0

82

3

H2 Database 연결이 안됩니다.

0

88

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

83

1

임베디드 타입 예시 코드 관련 질문

0

112

3

명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요

0

90

3

인텔리제이 패키지 커서 단축키 질문

0

106

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

136

1

양방향 연관관계 시 연관관계 주인을 설정하는 이유

0

68

1

임베디드 타입과 MappedSuperClass의 차이점이 궁금합니다.

0

95

1