2013-10-14 1 views
0

최근에 나는 작은 프로그램을 썼는데, 주목할만한 것은 거의 없었습니다. 대부분 그 당시 실제 응용 프로그램에 맞지 않는 새로운 것들을 테스트했습니다. 이 중 하나는 Hibernate 엔티티에 대한 시퀀스 생성 (기본 Oracle 데이터베이스에 의한) ID 대신 UUID를 사용하는 것이 었습니다.Hibernate 기본 키 식별자가 잘못된 디자인으로 간주되므로 UUID를 사용합니까?

동료 중 한 명은 이것이 나쁜 설계이며 시스템 자체에 부정적인 영향을 미쳤습니다 (ID가 데이터베이스에서 제공하지 못함, 즉 제어력 상실) 또는 성능 (UUID를 생성하지 않지만 데이터베이스 측에서 처리). 이 주장을 뒷받침하는 요점이 있습니까, 아니면 불만 스러움입니까? 내 말은, 생성기가 Hibernate에 의해 제공된다는 것입니다. 누군가가 좋은 아이디어를 생각한 것 같지 않습니다. 또한 시퀀스를 제거하는 것이 좋은 트레이드 오프 인 것처럼 보이지 않습니다. 나쁜 것은 아니며 오버 헤드처럼 느껴지기도합니다.

답변

0

UIID는 INTEGER (11)의 크기보다 몇 배나 크기 때문에 성능에만 큰 영향을 미칩니다. 어떤 이유로 든 이 아님은 이미 데이터베이스에 내장 된 시설을 사용하고 있지 않습니다. 그것은 정말로 당신이 반대하는 반대자가 아니라 그 과정을 정당화해야합니다.

1

데이터베이스를 사용하여 기본 키를 생성하지 않아도 UUID를 사용할 수 있습니다. 응용 프로그램의 여러 인스턴스를 배포하고 전역 코디네이터 없이도 로컬로 ID를 생성 할 수 있습니다. 전역 조정자를 사용하면 확장 성이 저하 될 수 있습니다.

대량 삽입하는 경우 UUID가 키 공간에 고르게 분산되어 있기 때문에 성능 문제가 발생할 수 있습니다. 따라서 키가 고유한지 확인하기위한 많은 검색이 가능합니다.

데이터베이스에 따라 UUID와 관련하여 튜닝을 고려해야합니다. Postgres에는 uuid 열이 있고, MySQL에서는 UTF8 오버 헤드를 피하기 위해 바이너리로 나타낼 수 있습니다.

UUID에 대한 또 다른 이점 : ID를 프런트 엔드/최종 사용자에게 노출하면 데이터베이스에있는 개체 수를 볼 수 없으며 다음 ID도 추측 할 수 없습니다.

2

시퀀스가 ​​마음에 들지 않으면 (인스턴스간에 이식성 등의 단점이 있습니다) 오라클의 GUID를 사용하지 않는 이유는 무엇입니까? 자동으로 또한 기본 키를 생성 할 수 있습니다 : 당신은 심지어 PK가 (삽입에 seq.nextval를 사용하여 지속적으로 시퀀스에 대한 트리거 또는) 채워되지 않은 방법에 대해 걱정하지 않아도

create table my_tab2 
(
val1 raw(16) default sys_guid(), 
val2 varchar2(100), 
primary key(val1) 
) 
table MY_TAB2 created. 
> insert into my_tab2 (val2) values ('A test val') 
1 rows inserted. 
> commit 
committed. 
> select * from my_tab2 
VAL1        VAL2                        
-------------------------------- ---------------------------------------------------------------------------------------------------- 
E8B47FA523673C97E040A8C014175791 A test val 

. 그냥보기에는 그리보기 싫어. (내가 생각하는 숫자처럼 "훌륭하지"않은).

또한 테이블에 대한 키를 생성하기 위해 Hibernate (또는 데이터베이스 외부의 다른 앱/시스템)에 의존하는 경우, 테이블은 유지되어야하며, Hibernate에 의존하거나 100 % 청렴. 데이터는 회사가 아닌 응용 프로그램에 속합니다. 필자의 견해로는 데이터베이스 계층은 가능한 한 독립적이어야한다. (이 경우 단순히 Hibernate에 의해 생성 된 무언가 대신에 오라클의 sys_guid를 사용하여 데이터 계층의 독립성이 향상된다.) 이 경우 사소한 것처럼 보일 수 있지만 오라클이 먼저 제공하는 기능을 사용하십시오.

관련 문제