Today I Learned

hasMany와 belongsTo 차이점

c3epmos 2020. 1. 18. 13:59

문제

예제와 같이, 1:N 관계를 맺기 위해서 hasmany()와 belongsTo()를 이용했다. 그러나, 똑같은 외래키가 중복되서 생성되는 문제점이 발생했다. 일단, hasmany()를 제거하고 belongsTo() 만 사용해서 DB를 사용하였지만, 이 둘의 차이점을 조사해서 더 적절하게 사용해야할 필요성을 느꼈다.

 

이 둘의 차이점

상선에서 근무하는 선원들을 관리하는 데이터베이스를 관리한다고 가정해보자. 각 배에서는 선원들이 근무할 것이고, 배는 여러 선원들이 일할 수 있고 선원들은 한 배에서만 일할 수 있는 1:N 관계이다.

 

이러한 관계를 다음과 같은 메소드로 정의할 수 있다.

Member.belongsTo(Ship);

이 메소드는 getShip() 메소드로 해당 선원이 어떤 배에서 근무하는지 확인할 수 있다.

 

그리고 반대로 다음과 같은 메소드로 정의할 수도 있다.

Ship.hasMany(Member);

이 메소드는 이 배에 어떤 선원들이 근무하는지 getMembers() 메소드로 확인할 수 있다.

 

위에 선으로 그은 부분도 맞는 부분이 있지만, get method로 정보를 얻어오는 것은 실패했다. 그래서 서적을 참고해보니 1 : N 관계에서 N을 갖는 쪽에서 hasMany로 정의하고, 1을 갖는 쪽에서 belongsTo로 정의하면 어느 테이블에서도 참조 테이블을 불러올 수 있었다.

해결

이전에는 스키마를 정의할 때, foreign key를 수동으로 정의했으나 위에 설명한 hasMany, belongTo를 이용해 정의하면 자동으로 외래키를 생성해 sequelize에서 제공하는 메소드들을 오류없이 사용할 수 있었다. 

 

/models/board.js

참조당하는 테이블에 hasMany, sourcekey로 정의하고, 참조를 하는 테이블에 belongsTo, targetkey로 정의한다.

 

/routes/boards/index.js

다음과 같이 include 옵션을 이용해 자유롭게 사용할 수 있다.

 

출처

https://stackoverflow.com/questions/20290815/belongsto-vs-hasmany-in-sequelize-js

 

'belongsTo' vs 'hasMany' in Sequelize.js

What's the difference between B.belongsTo(A) and A.hasMany(B) Artist = sequelize.define('Artist', {}); Album = sequelize.define('Albums', {}); Album.belongsTo(Artist, foreignKey: 'album_belongsl_...

stackoverflow.com

https://medium.com/@edtimmer/sequelize-associations-basics-bde90c0deeaa

 

Sequelize BelongsTo & HasMany Associations

This post shows use of Sequelize BelongsTo and HasMany associations with some querying examples.

medium.com