시퀄라이저로 2개의 테이블을 만들고 연결하려고 했는데,
개념적인 부분이 정말 어려웠다.
기본키는 뭐고, 참조키는 뭐고, 어떤식으로 연결하는걸까?
그것에 대해서 살펴보자.
🚗 기본기 (primary key)
- 테이블에 있는 유일무이한 데이터 구분하기 위한 것.
- 오직 한개만 지정할 수 있다.
- 다른 열과 명확하게 구분될 수 있는 열에 포함된 유일무이한 데이터를 의미.
- null 가질수가 없다. 중복값도 불가하다.
- 싱글필드 혹은 멀티 필드로 구성이 가능 하다.
🚗 외부 참조키 (Foreign key)
- 다른 테이블 또는 같은 테이블에서 식별될 수 있는 행을 포함한 필드.
- 테이블 간의 관계 설명 가능.
- 학생 테이블이 먼저 있고, 수강내역 테이블이 있다고 해보자.
- 참조될 값은 참조하려 하는 테이블에서 기본키(primary key)로 설정되어 있어야 한다.
- 학생테이블의 아이디 값이 primary key로 되어 있다면,
- 수강내역 테이블과 연결하기 위해 학생 테이블의 primary key를 참조하여 외래키로 만들 수 있다.
❗️❗️❗️
- 단 부모 테이블 먼저 삭제 할 수 없고, 부모테이블이 먼저 생성된 뒤에 데이터 넣고, 그 다음 자식 테이블이 생겨야 한다.
- 또한 외래키 관계에서 부모테이블을 삭제하려면, 자식테이블 먼저 삭제한 후에 부모테이블을 삭제해야 한다.
관계 설정
보다보면, 1 : 1 관계, 1 : N 관계, N : N 관계가 있다.
이는 간단하게 보면,
1명의 유저가 1개의 글만 작성할 수 있다고 하면, 1 : 1 관계,
1명의 유저가 n개의 글만 작성할 수 있다고 하면, 1 : N 관계,
n명의 유저가 n개의 글만 작성할 수 있다고 하면, N : N 관계.
이렇게 생각하면 좀더 쉬웠다.
그런데 이 관계를 설정하기 위해서 어떤 명령어를 입력해야 할까?
이번에는 1:n 관계에 대한 내용만 다뤄보겠다.
아래는 관계 설정을 위한 예시 코드이다.
1 : N 관계 설정을 위한 코드이며, models 폴더 내부에서 일어난 작업이다.
과정에서, 새로운 용어들이 좀 나오고, 어떤걸 의미하는지 정리가 안되었다.
공부하면서 많이 했갈렸어서 여기에 같이 정리해 둔다.
🚙 hasOne 혹은 hasMany
- 내어주는 애. 대장
참조하는 컬럼이 생성되지 않는다.
🚓 belongsTo
- 이 테이블은 다른 테이블에 속하겠다는 의미. 쫄병
- 얘를 쓰면 참조하는 컬럼이 생김
- 예를 들면 UserId 컬럼이라던지, commenter 컬럼이라던지
🔮 sourceKey
- 다른테이블에서 가져다 쓸 수 있도록 특정 컬럼을 내보낼 애를 지정한다 (대장 테이블에서)
🔮 targetKey
- 대장 테이블이 아닌 쫄병 테이블에서 지정할때 사용되는 용어이다.
- 대장 테이블에서 가져오려고 하는 컬럼 타겟을 말한다.
🔮 foreignKey
- 외부참조키 즉 외래키 라고도 불린다.
- 외부에서 참조해 가져오려고 했던 그 키 값을 적어주면 된다.
- belongsTo 측과, hasMany 측 모두 동일하게 적어주면 된다.
🚍 1 : N 관계 설정 하기
일단 시퀄라이즈로 테이블을 생성하는 과정에서 먼저 출발한다.
npx sequelize init
npx sequelize db:create. //db를 생성
npx sequelize model:generate --name 테이블이름 --attributes 컬럼명:타입,컬럼명:타입
이렇게 해주면 migration 폴더에 파일이 생긴다.
그럼 해당 파일에 수정하거나 추가할 부분을 기재해 주면 되는데,
지금 관계설정을 위한 부분을 기재해 줘야 한다.
나의 경우 UsersData 테이블이 1, products 테이블이 N 인 관계 설정을 하고자 했다.
그래서 products migration 파일로 가서, userId 값에 references를 추가해 줬다.
userId: {
allowNull: false,
type: Sequelize.INTEGER,
references: {
model: 'UsersData',
key: 'id',
},
onUpdate: 'CASCADE',
},
UsersData 테이블에는 참조할 값이 없기 때문에 적지 않았다.
그리고 models 폴더에 있는 각 테이블 파일을 만져야 하는데,
상단에 위치한 static associate 를 만지면 된다.
forginkey, soursekey 설정은 위에서 말한 개념에 따라서 설정해 주면 된다.
// models/User.js
static associate(models){
this.hasMany(models.Product, { //여기에는 관계를 맺으려고 하는 모델이 적혀있음
sourceKey : 'id', // __ 해당 파일의 모델에 id 컬럼
foreignKey : 'userId'//__관계를 맺으려 하는 모델에 userId 컬럼과 연결.
})
}
// models/Product.js
static associate(models){
this.belongsTo(models.User, { //관계 대장이 적혀있음. 나는 너에게 종속되겠소.
targetKey : 'id', // __ 관계 대장 모델의 id 컬럼 타겟으로 하겠음.
foreignKey : 'userId' // __ 쫄병 모델에 userId 컬럼과 타겟키을 연결.
})
}