Natural key vs Surrgate key

  • 후보키candidate key는 다음과 같은 특징을 가진다.

    • NULL 값을 갖지 않는다.
    • 유일한 값을 갖는다.
    • 값이 절대로 변하지 않는다.
  • A natural key is a key with business meaning: an attribute
    or combination of attributes that is unique by virtue of its business
    semantics.
  • Natural key를 주키로 사용해 왔지만, 다음과 같은 문제가 있다.

    • 변하지 않고, 고유하면서, 필수인 값을 찾기가 어렵다. 주키 값을 변경하는 작업은 완전 빡쎄며, 인덱스로 사용하기도 적절하지 않다.
    • 주로 복합키로 구성되는데, 이 것들이 보통 쿼리 작성, 스키마 수정, 유지보수를 어렵게 한다.
  • 그래서 Surrogate key 사용을 추천한다.

    • Surrogate keys have no business meaning—they're unique values generated by the database or application.

key generator 선택하기

  • Hibernate has several built-in identifier-generation strategies.
Generator name JPA Generation Type Option 설명
native AUTO   사용하는 DB에 따라서 sequence, hilo, identity를 알아서 선택함. 설정의 이식성을 고려한다면, 이 설정을 사용할 것.
identity IDENTITY   DB2, MySQL, MS SQL Server, Sybase, HypersonicSQL에 있는 identity 컬럼을 지원한다. long, short, int 타입의 값을 반환함.
sequence SEQUENCE sequence, parameters DB2, PostgreSQL, Oracle, SAP DB, Mckoi에서
sequence를 생성한다. long, short, int 타입의 값을 반환함. sequence 옵션을 사용해서 시퀀스의 이름을
설정할 수 있고, DDL에 추가할 시퀀스를 만들 때 필요한 추가 세팅이 필요할 때 parameters를 사용함.
increment     하이버네이트가 동작하면서 테이블의 주키 컬럼 값 중에 최대값을 읽은 다음 새로운 레코드를 추가할 때, 그 값을 1씩 증가시킴. 단일 서버에서 DB에 독립적으로 접근하는 경우 외에는 사용하지 말아라.
hilo   table, column, max_lo A high/low algorithm is an efficient way to
generate identifiers of type long, given a table and column as a source
of high values.
seqhilo   sequence, parameters, max_lo named database sequence에서 high 값을 걷는 것을 빼고 hilo와 동일하다.
  TABLE table, catalog, schema, pkColumnName, valueColumnName, pkColumnValue, allocationSize TABLE relies on a database table that holds
the lastgenerated integer primary key value, and each generator is
mapped to one row in this table.
uuid.hex   separator This generator is a 128-bit UUID (an algorithm that generates identifiers of type string, unique within a network).
guid     This generator provides a database-generated globally unique identifier string on MySQL and SQL Server.
select   key This generator retrieves a primary key
assigned by a database trigger by selecting the row by some unique key
and retrieving the primary key value
하이버네이트 identity generator 사용하기
@Entity
@org.hibernate.annotations.GenericGenerator(name="hibernate-uuid", strategy="uuid")
@Table(name="CATEGORY")
public class Category {

@Id
@GeneratedValue(generator="hibernate-uuid")
@Column(name="CATEGORY_ID")
private Long id;

public Long getId() {
return id;
}

}
  • hibernate-uuid라는 이름으로 uuid 생성기를 사용하는 코드.
  • You aren't limited to the built-in strategies; you can
    create your own identifier generator by implementing Hibernate's
    IdentifierGenerator interface.