반응형
💋 다중 기본키가 왜 필요함?
오늘 이리내랑 JAVA로 만든 체스 게임을 DB에 연결하고 있었다.
체스판에서 각 위치를 A1, A2, A3,...,B1,B2,...H8라고 부르는데, 우리는 각 위치에 체스말(Piece)의 종류(King, Queen, Knight...)와 그 색깔(Black, White)을 저장하고 싶었다.
아마도 두 가지 방법이 있을 것이다.
1. A,B,C...H(File)과 1,2,...8(Rank)를 다중 기본키로 설정하는 방법!
만약 내 코드가 이 두 가지를 Position이라는 클래스 내에서 별도로 관리중이라면 굉장히 유용할 것이다.
이 경우 다중 기본키를 지정한 테이블을 만들어야 한다.
💋 다중 기본키 테이블 만들기 (SQL)
CREATE TABLE chess_game(
position_file VARCHAR(255) NOT NULL,
position_rank VARCHAR(255) NOT NULL,
piece_type VARCHAR(255),
piece_color VARCHAR(255),
constraint chess_game_pk primary key(position_file, position_rank)
);
position_file, position_rank를 다중 키로 하는 테이블을 생성했다!
2. 기본키를 "A1", ... "H8"같은 Position으로 지정하는 방법!
이 경우에는 JAVA에서 A(File)와 1(Rank)를 별도로 관리하고 있다면 별도로 합쳐주는 메서드를 별도로 구현해야 할 것이다. 아래 코드처럼 캐싱을 하기 위해서 이미 static 메서드인 of()가 있을 경우, 이 방법이 편리할 수 있다.
* 위의 복잡한 코드는 캐싱을 위한 것이므로, of() 메서드가 file, rank를 모아서 Position을 반환하는 식으로 이미 관리하고 있다는 것만 이해해도 된다!
public final class Position {
private static final Map<String, Position> CACHE = new HashMap<>();
static {
for (File file : File.values()) {
for (Rank rank : Rank.values()) {
CACHE.put(file.command() + rank.command(), new Position(file, rank));
}
}
}
private final File file;
private final Rank rank;
private Position(final File file, final Rank rank) {
this.file = file;
this.rank = rank;
}
public static Position of(final String file, final String rank) {
return of(File.from(file), Rank.from(rank));
}
public File file() {
return file;
}
public Rank rank() {
return rank;
}
}
아래는 의미없는 사진이고 썸네일용이다 ><
반응형
'Computer Science > Database' 카테고리의 다른 글
[DB] 데이터베이스 용어 정리: DBMS, metadata, data models, schema, state, three-schema architecture 등등 (0) | 2023.12.02 |
---|---|
[DB] Connection Pool: 개념, 등장 배경, Spring Boot에서 HikariCP 커넥션 풀 설정하기 (0) | 2023.09.30 |
[DB] 클러스터링 인덱스: 인덱스의 개념, MySQL에서 리프 노드에 메모리 주소가 아닌 Primary Key를 저장하는 이유 (2) | 2023.08.31 |
[DB/H2] H2 데이터베이스 버전 확인 (0) | 2023.06.29 |
[DB/H2] H2 데이터베이스 설치부터 실행까지 (0) | 2023.06.15 |