개요
- deadlock 방지
- FK에 해당하는 레코드가 있는 지 조회하기 위해 lock이 걸리는데, 이 lock으로 인한 성능 저하를 줄이기 위해서
- 이 두 가지 리스크가 FK Constraint를 걸어서 얻는 이점보다 크다고 판단함
- 일반적으로 FK에 대응되는 레코드가 없을 때 발생하는 손실이 전체 DB 성능 저하보다 크지 않음
- JOIN 또는 SELECT 결과가 NULL일 테니 쉽게 탐지 가능함
- 프로그래밍적으로 제어 가능
- 단, FK Constraint는 끊어도 FK에 Index는 생성해야 한다
- JOIN 성능을 위해서
- 일부 ORM은 FK Constraint를 끊으면 Index도 사라지니 잘 확인해야 한다
JPA에서 FK Constraint 제거하는 방법
foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)
옵션을 쓰면 JPA에서 생성하는 ddl에서 FK Constraint가 제거된다.
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "users_id",foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
private UserEntity postUser;
여담
- 전 직장에서 `user` 테이블이 변경이 자주 일어나는 테이블을 참조하고 있어서 성능 저하를 겪었고, FK Constraint를 제거해서 해결했다
- 전 직장에서 뵈었던 스타트업 CTO님과 퇴사 후 멘토링을 진행했던 시니어 개발자님께서도 실무에서 FK Contraint를 사용하지 않는다는 말씀을 공통적으로 해 주셨다
'Computer Science' 카테고리의 다른 글
[Network][스크랩] HTTP Status Code 422 - Unprocessable Entity (0) | 2024.08.02 |
---|---|
[DB] MySQL에서 WHERE IN, JOIN, EXISTS의 성능 비교 (0) | 2024.07.05 |
[Network][스크랩] Bearer Authentication 헤더 규칙이 정해진 배경 (0) | 2024.06.24 |
Reactive Programming (0) | 2024.04.16 |
[Network] HTTP response status code (0) | 2024.04.06 |