이전 블로그를 보면 정규화를 거쳐 테이블의 데이터 중복을 피하고 전체적인 데이터베이스의 성능을 향상시키는데 도움을 줄수있습니다.
아래의 사진처럼 테이블과 테이블과의 관계는 외래키를 이용해 표현합니다.
- 왼쪽 테이블의 제조사
id는 오른쪽 테이블의PK인id를 가지고 있습니다. 즉 왼쪽 테이블의 제조사id는 외래키라고 할수있습니다.
➡ 일반적으로 테이블과 테이블의 관계는 3종류로 나눌수 있습니다.
이전에 강의를 통해 정리한 블로그 입니다.
Membmer 엔티티 클래스와 Locker 엔티티 클래스와 일대일 연관관계를 맺은 코드입니다.@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "locker_id")
private Locker locker;
}
mappedBy = "locker" 를 작성하면 Member 엔티티의 locker 필드와 매핑되었다는 뜻이며, 양방향 관계이며 읽기전용입니다. @Entity
public class Locker {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "locker_id")
private Long id;
private String name;
@OneToOne(mappedBy = "locker")
private Member member;
}
@Entity
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "teams")
private Member member;
}
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "member")
private List<Team> teams;
}
위 로직 처럼 다대일 방향으로 연관관계를 하는것이 좋습니다.
외래키는 다 쪽에, 외래키가 있는 쪽이 연관관계 주인
❗❗ 다대다 관계는 실무에서는 사용하면 안된다고 합니다.
이전 강의를 보며 정리한 블로그 입니다.
다대다 관계에서는 단순히
@ManyToMany로 매핑 할수 없으며, 중간에
Join테이블을 두어 연결해야 합니다.
- 하지만 중간
Join테이블에 다양한 컬럼이 추가 될수 있는데, 추가된 컬럼을 매핑 할수 없습니다.
fetch 방식을 무조건적으로 Lazy (지연로딩) 방식으로 바꿔줘야 합니다. (One To One, Many To One 등)즉시로딩과 지연로딩은 뒤에서 다루겠습니다.
외래키는 주테이블 (많이 접근하는 테이블) 에 설정하는것이 좋습니다.
보통 다대일과 일대다 관계를 실무에서 가장 많이 사용하고 다대다 관계는 실무에서 거의 사용하지 않습니다.
https://velog.io/@conatuseus/2019-08-30-1808-%EC%9E%91%EC%84%B1%EB%90%A8-s7jzxxz2t0