TIL

23/11/13 TIL __ 시퀄라이저 관계 설정.

GABOJOK 2023. 11. 13. 23:51

 

 

 시퀄라이저로 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 컬럼과 타겟키을 연결.
	})
}