관계는 데이터베이스에서 테이블 간의 상호작용을 정의하여 복잡한 데이터 구조를 단순화하고 관리하는 방법이다. 이러한 관계를 통해 데이터의 무결성과 일관성을 유지할 수 있다.
Sequelize는 주로 세 가지 관계를 지원한다.
1) 1 : 1 (One-to-One)
2) 1 : 다 (One-to-Many)
3) 다 : 다 (Many-to-Many)
1 : 1 관계는 두 테이블 간에 각 레코드가 오직 하나의 대응 레코드만을 가지는 구조이다.
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)
);
User.hasOne(Profile, { foreignKey: "user_id", onDelete: "CASCADE" });
Profile.belongsTo(User, { foreignKey: "user_id", onDelete: "CASCADE" });
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 : 다 관계는 한 테이블의 레코드가 여러 다른 테이블의 레코드와 연결되는 구조이다. 주로 부모 엔티티와 자식 엔티티 사이의 관계를 나타내는 데 사용된다.
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)
);
Customer.hasMany(Order, { foreignKey: "customer_id" });
Order.belongsTo(Customer, { foreignKey: "customer_id" });
🔍 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"로 외래 키를 지정하고, 각 주문이 어떤 고객에 의해 생성되었는지를 연결한다.
다 : 다 관계는 두 테이블 간의 모든 레코드가 서로 여러 레코드와 연결되는 구조이다. 이 관계는 중간 테이블을 통해 구현된다.
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)
);
Student.belongsToMany(Teacher, { through: StudentTeacherRelation });
Teacher.belongsToMany(Student, { through: StudentTeacherRelation });
🔍 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을 사용하면 이러한 관계를 손쉽게 설정하고 관리할 수 있다.