SQL에서 1:1 (OneToOne) 관계를 정의할 때 반드시 고려해야 하는 부분이 있다.
예시를 통해 살펴보자.
주어진 상황
아래는 내가 설계한 DB의 일부이다.
계정과 회원을 굳이 분리한 이유는 성격이 다르다고 생각해서이다.
계정은 회원 정보에 속하기 때문에 보안 등급이 더 높고, 다른 테이블에서 Join을 할 때 회원 정보는 필요하지만 계정 정보는 필요하지 않기 때문에 해당과 같이 설계하였다.
계정과 회원은 1:1 (OneToOne) 관계를 맺는다.
이때 중요한 것은 서로에 대한 참조 키에 Unieque key를 걸어줘야 한다는 점이다.
Unieque key
위 DB를 기준으로, User 테이블의 account_id 컬럼에 Unique Key를 걸어줘야 비로소 1:1이 된다.
Unique key 조건을 걸지 않으면 앱 서버단에서 ORM 등을 사용해서 매핑할 때 문제가 생길 가능성이 크다.
반면, 해당 컬럼에 Unieque key를 걸면 아래의 문제가 생길 수 있다.
- 그럼 Soft Delete는 어떻게 하나요..?!
- User 레코드를 Soft Delete한 후 새로 레코드를 만들면 Unique 제약에 걸리는데요..?!
그것이 Soft Delete의 단점이다. RDB는 key column을 기반으로 관계를 정의한다.
-> 가능하면 로그를 쌓거나 백업 데이터를 모으는 것을 권장한다.
하지만 정말 Soft Delete가 필요한 시점이라면 프로그램 단에서라도 Unique Key를 걸자.
JPA의 경우 아래와 같이 구현할 수 있다.
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true)
private long accountId;
}
참고
'Database > SQL' 카테고리의 다른 글
MySQL - 이모지(Emoji) 뒷 내용이 모두 잘리는 문제 해결! (0) | 2023.04.05 |
---|---|
MySQL - 락 불필요한 데이터를 잠그는 문제 정리! (+ Index) (0) | 2023.02.17 |
Real MySQL - Replication(복제)란 무엇인가?! (0) | 2022.07.07 |
MySQL - 비트마스크 컬럼을 사용하지 않아도 되는 이유 (+ SET Type) (0) | 2022.06.30 |
Real MySQL - 파티션이란 무엇인가?! (0) | 2022.06.29 |