중고 상품을 파는 마켓이라고 할 때, 테이블은 다음과 같이 나눠질 수 있다.
- 상품 테이블
- 상품 거래 위치 테이블
- 상품 카테고리 테이블
- 판매자 테이블
- 상품 태그 테이블
각 테이블 간의 관계를 설정해보자.
중고 상품이므로 각 상품은 유일하다.
상품 거래 위치도 유일하기 때문에 (우연의 일치로 위도와 경도가 아주 똑같다는 것을 제외) 1:1 관계가 설정된다.
(@OneToOne())
@JoinColumn()
@OneToOne(() => ProductSaleslocation)
productSaleslocation: ProductSaleslocation
상품은 하나의 카테고리만 가진다.
반면 카테고리는 여러 개의 상품을 가질 수 있다.
상품의 입장에서 본다면 N:1 관계다. (@ManyToOne())
@ManyToOne(() => ProductCategory)
productCategory: ProductCategory
회원은 여러 개의 상품을 판매할 수 있다.
하지만 각 상품의 판매자는 한 명이다.
상품 입장에서 회원은 N:1 관계다. (@ManyToOne())
@ManyToOne(() => User)
user: User
하나의 상품은 여러 개의 태그를 가질 수 있고,
태그도 여러 개의 상품에 해당할 수 있다.
N:M 관계다.
@JoinTable()
@ManyToOne(() => ProductTag, (productTags) => ProductTags.products
productTags:ProductTag[];
반대 테이블도 반대 입장에서 동일하게 설정해줘야 한다.