Sequelize 의 Relationship

민정이등장·2024년 10월 24일
0
post-thumbnail

📌 관계(Relationship)란?

관계는 데이터베이스에서 테이블 간의 상호작용을 정의하여 복잡한 데이터 구조를 단순화하고 관리하는 방법이다. 이러한 관계를 통해 데이터의 무결성과 일관성을 유지할 수 있다.

Sequelize는 주로 세 가지 관계를 지원한다.
1) 1 : 1 (One-to-One)
2) 1 : 다 (One-to-Many)
3) 다 : 다 (Many-to-Many)


📖 1 : 1 관계 (One-to-One)

1 : 1 관계는 두 테이블 간에 각 레코드가 오직 하나의 대응 레코드만을 가지는 구조이다.

예시

  • 사용자와 프로필: 각 사용자는 하나의 프로필을 가지고 있다.
  • 직원과 연차: 각 직원은 하나의 연차 정보를 가진다.
  • 주문과 송장: 각 주문에 대해 하나의 송장이 발급된다.

SQL 테이블 생성

CREATE TABLE user (
	id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    password VARCHAR(100) NOT NULL
);

CREATE TABLE profile (
	id INT PRIMARY KEY,
    user_id INT,
    introduce VARCHAR(100),
    FOREIGN KEY (user_id) REFERENCES user (id)
);

Sequelize 관계 설정

User.hasOne(Profile, { foreignKey: "user_id", onDelete: "CASCADE" });
Profile.belongsTo(User, { foreignKey: "user_id", onDelete: "CASCADE" });
  • hasOne: User 모델이 Profile 모델과 1:1 관계를 형성하는 것이다.
  • belongsTo: Profile 모델이 User 모델을 가리키는 것이다.

Tip: onDelete: "CASCADE" 옵션을 사용하여 사용자가 삭제될 경우 해당 프로필도 자동으로 삭제되도록 설정할 수 있다.


🔍 User.hasOne(Profile, { foreignKey: "user_id", onDelete: "CASCADE" }) :

User 모델이 Profile 모델과 1:1 관계를 가지고 있다. 즉, 한 사용자는 하나의 프로필만 가질 수 있다.
foreignKey : "user_id"Profile 테이블에서 사용자 ID를 나타내는 필드가 user_id임을 지정한다.
onDelete : "CASCADE"는 사용자가 삭제될 때 그에 연결된 프로필도 자동으로 삭제되도록 설정한다.

🔍 Profile.belongsTo(User, { foreignKey: "user_id", onDelete: "CASCADE" }) :

Profile 모델이 User 모델에 속해 있음을 나타낸다. 즉, 각 프로필은 특정 사용자에 의해 소속된다.
foreignKey: "user_id"로 외래 키를 지정하고, 사용자 삭제 시 관련 프로필이 삭제되도록 설정한다.


User.hasOne(Profile, { foreignKey: "user_id", onDelete: "CASCADE" });를 사용하면 User 모델이 Profile 모델에 1:1 관계를 형성한다고 선언하는 것이다. 하지만 이 관계를 완전하게 정의하려면 Profile 모델이 User 모델에 속한다는 것을 나타내는 Profile.belongsTo(User, { foreignKey: "user_id", onDelete: "CASCADE" });도 함께 설정해야 한다.


📖 1 : 다 관계 (One-to-Many)

1 : 다 관계는 한 테이블의 레코드가 여러 다른 테이블의 레코드와 연결되는 구조이다. 주로 부모 엔티티와 자식 엔티티 사이의 관계를 나타내는 데 사용된다.

예시

  • 부서와 직원: 한 부서는 여러 직원을 가질 수 있다.
  • 고객과 주문: 한 고객은 여러 개의 주문을 할 수 있다.
  • 학교와 학생: 하나의 학교는 여러 학생을 가질 수 있다.

SQL 테이블 생성

CREATE TABLE customers (
	customer_id INT PRIMARY KEY AUTO_INCREMENT,
    customer_name VARCHAR(255),
    customer_email VARCHAR(255)
);

CREATE TABLE orders (
	order_id INT PRIMARY KEY,
    order_date DATE,
    customer_id INT,
    FOREIGN KEY (customer_id) REFERENCES customers (customer_id)
);

Sequelize 관계 설정

Customer.hasMany(Order, { foreignKey: "customer_id" });
Order.belongsTo(Customer, { foreignKey: "customer_id" });
  • hasMany: 한 고객이 여러 주문을 생성할 수 있음을 나타내는 것이다.
  • belongsTo: 주문은 반드시 한 고객에 속해야 하는 것이다.

🔍 Customer.hasMany(Order, { foreignKey: "customer_id" })

Customer 모델이 Order 모델과 1 (일대다) 관계를 가지고 있다. 즉, 한 명의 고객은 여러 개의 주문을 가질 수 있다.
foreignKey: "customer_id"Order 테이블에서 고객 ID를 나타내는 필드가 customer_id임을 지정한다. 이는 Order 테이블이 Customer 테이블의 id를 참조하는 외래 키임을 의미한다.

🔍 Order.belongsTo(Customer, { foreignKey: "customer_id" })

Order 모델이 Customer 모델에 속해 있음을 나타낸다. 즉, 각 주문은 특정 고객에 의해 소속된다.
foreignKey: "customer_id"로 외래 키를 지정하고, 각 주문이 어떤 고객에 의해 생성되었는지를 연결한다.


📖 다 : 다 관계 (Many-to-Many)

다 : 다 관계는 두 테이블 간의 모든 레코드가 서로 여러 레코드와 연결되는 구조이다. 이 관계는 중간 테이블을 통해 구현된다.

예시

  • 학생과 과목: 한 학생은 여러 과목을 수강할 수 있으며, 하나의 과목도 여러 학생이 수강할 수 있다.
  • 주문과 제품: 하나의 주문은 여러 제품을 포함할 수 있고, 각 제품은 여러 주문에 포함될 수 있다.
  • 배우와 영화: 한 배우는 여러 영화에 출연할 수 있으며, 하나의 영화에도 여러 배우가 출연할 수 있다.

SQL 테이블 생성

CREATE TABLE Students (
	StudentID INT PRIMARY KEY,
	StudentName VARCHAR(50)
);

CREATE TABLE Teachers (
	TeacherID INT PRIMARY KEY,
	TeacherName VARCHAR(50)
);

CREATE TABLE StudentTeacherRelation (
	RelationID INT PRIMARY KEY,
	StudentID INT,
	TeacherID INT,
	FOREIGN KEY (StudentID) REFERENCES Students (StudentID),
    FOREIGN KEY (TeacherID) REFERENCES Teachers (TeacherID)
);

Sequelize 관계 설정

Student.belongsToMany(Teacher, { through: StudentTeacherRelation });
Teacher.belongsToMany(Student, { through: StudentTeacherRelation });
  • belongsToMany: 다:다 관계를 설정할 때 사용되는 메서드이다. 중간 테이블을 통해 서로의 관계를 관리하는 것이다.

🔍 Student.belongsToMany(Teacher, { through: StudentTeacherRelation })

Student 모델이 Teacher 모델과 N (다대다) 관계를 가지고 있다. 즉, 한 명의 학생은 여러 명의 교사와 관계를 맺을 수 있고, 한 명의 교사도 여러 명의 학생과 관계를 맺을 수 있다.
{ through: StudentTeacherRelation }은 이 다대다 관계를 관리하기 위해 사용할 중간 테이블을 StudentTeacherRelation으로 지정한다. 이 중간 테이블은 학생과 교사 간의 관계를 나타내는 데이터(예: 학생 ID와 교사 ID)를 저장하는 역할을 한다.

🔍 Teacher.belongsToMany(Student, { through: StudentTeacherRelation })

Teacher 모델이 Student 모델에 대해 N 관계를 형성하고 있음을 나타낸다. 즉, 한 명의 교사는 여러 명의 학생과 관계를 맺을 수 있다.
마찬가지로 { through: StudentTeacherRelation }을 통해 이 관계를 관리하는 중간 테이블로 StudentTeacherRelation을 사용한다.


결론

관계 설정은 데이터베이스 설계에서 중요한 요소이다. 적절한 관계를 설정함으로써 데이터의 무결성을 보장하고, 복잡한 데이터 구조를 효율적으로 관리할 수 있다. Sequelize와 같은 ORM을 사용하면 이러한 관계를 손쉽게 설정하고 관리할 수 있다.

profile
킵고잉~

0개의 댓글