Relation νμ κ°μ
Sonamuλ 4κ°μ§ Relation νμ μ μ§μν©λλ€:BelongsToOne
N:1 κ΄κ³ - λ€μκ° νλλ₯Ό μ°Έμ‘° μ: Post β User (μ¬λ¬ κ²μκΈμ΄ ν μ¬μ©μμκ² μν¨)
OneToOne
1:1 κ΄κ³ - μλ‘ νλμ©λ§ μ°Έμ‘° μ: User β Employee (μ¬μ©μμ μ§μ μ λ³΄κ° 1:1 λ§€μΉ)
HasMany
1:N κ΄κ³ - νλκ° μ¬λΏμ μμ μ: User β Posts (ν μ¬μ©μκ° μ¬λ¬ κ²μκΈ μμ )
ManyToMany
N:M κ΄κ³ - λ€λλ€ κ΄κ³ μ: Post β Tag (κ²μκΈκ³Ό νκ·Έμ λ€λλ€ κ΄κ³)
BelongsToOne
N:1 κ΄κ³ - νμ¬ Entityκ° λ€λ₯Έ Entityμ μνλ κ΄κ³μ λλ€.κΈ°λ³Έ μ¬μ©λ²
post.entity.json
user_id (integer, not null)
λ°μ΄ν°λ² μ΄μ€ ꡬ쑰:
μ΅μ
RelationOn μ΅μ
μμ : nullableκ³Ό CASCADE
department_idκ°NULLνμ©- λΆμκ° μμ λλ©΄ μ§μμ
department_idκ°NULLλ‘ μ€μ λ¨
TypeScript μ¬μ©
OneToOne
1:1 κ΄κ³ - λ Entityκ° μλ‘ νλμ©λ§ μ°Έμ‘°νλ κ΄κ³μ λλ€.κΈ°λ³Έ μ¬μ©λ²
OneToOneμ λ κ°μ§ λ°©μμΌλ‘ μ μν μ μμ΅λλ€:- hasJoinColumn: true
- hasJoinColumn: false
νμ¬ Entityμ FK 컬λΌμ΄ μμ±λ©λλ€.μμ±λλ 컬λΌ:
employee.entity.json
user_id (integer, unique, not null)λ°μ΄ν°λ² μ΄μ€ ꡬ쑰:μ΅μ
μμ : μλ°©ν₯ OneToOne
- Userλ Employeeλ₯Ό μ νμ μΌλ‘ κ°μ§ μ μμ (nullable)
- Employeeλ λ°λμ Userλ₯Ό κ°μ ΈμΌ ν¨ (not null)
- Userκ° μμ λλ©΄ Employeeλ ν¨κ» μμ λ¨ (CASCADE)
HasMany
1:N κ΄κ³ - νλμ Entityκ° μ¬λ¬ κ°μ λ€λ₯Έ Entityλ₯Ό μμ νλ κ΄κ³μ λλ€.κΈ°λ³Έ μ¬μ©λ²
user.entity.json
PostEntityμuser_id컬λΌμ΄ μμ΄μΌ ν¨- 보ν΅
PostμμBelongsToOneμΌλ‘ μλ°©ν₯ μ μ
μ΅μ
μμ : fromColumn μ¬μ©
TypeScript μ¬μ©
HasManyλ DataLoader ν¨ν΄μΌλ‘ μλ μ΅μ νλ©λλ€. N+1 쿼리 λ¬Έμ κ° λ°μνμ§ μμ΅λλ€.
ManyToMany
N:M κ΄κ³ - λ€λλ€ κ΄κ³λ₯Ό μ€κ° ν μ΄λΈ(Join Table)μ ν΅ν΄ ꡬνν©λλ€.κΈ°λ³Έ μ¬μ©λ²
post.entity.json
μ΅μ
μλ°©ν₯ μ μ
TypeScript μ¬μ©
Custom Join Clause
볡μ‘ν JOIN μ‘°κ±΄μ΄ νμν κ²½μ° SQL ννμμ μ§μ μμ±ν μ μμ΅λλ€.Relation νμ© ν¨ν΄
1. Subsetμμ Relation νλ μ ν
user: LEFT JOINtags: DataLoaderλ‘ λ³λ 쿼리
2. μ€μ²© Relation
3. Relation νν°λ§
4. Relation μ λ ¬
Relation μ€κ³ κ°μ΄λ
BelongsToOne vs OneToOne
CASCADE vs RESTRICT
nullable μ€μ
μ£Όμμ¬ν
λ€μ λ¨κ³
Enums
Enum νμ
μ μνκ³ νμ©νκΈ°
Subset
Subsetμ νμ©ν νμ
μμ ν 쿼리
Puri Query Builder
Relationμ νμ©ν 쿼리 μμ±νκΈ°
Performance
Relation 쿼리 μ΅μ ννκΈ°