2022.06.16 - TIL [mysql 외래키]

Seong Hyeon Kim·2022년 6월 16일
0

TIL

목록 보기
8/31

mysql

static associate(models) 
        { this.belongsTo(models.User, { foreignKey: 'userId', targetKey: 'userId' }) } }
        
        Board.init(
        {
            boardId: {
                primaryKey: true,
                type: DataTypes.INTEGER,
            },
            userId: DataTypes.INTEGER,
            title: DataTypes.STRING,
            content: DataTypes.STRING,
            image: DataTypes.STRING,
        },

외래키 라는 것을 설명하기전 프라이머리키에 대해서 먼저 설명을 해야한다.

primaryKey 는 몽고DB 사용할때 몽구스를 사용하여 스키마를 짤때 사용했던

유니크 값을 가진 키로 우선적으로 이해했고, 거기에다가 낫널 (NOT NULL)

즉 키 값이 NULL 이 될수도 없다 라는 특징을 가지고 있다.


1  김성현 30
2  김성현 30

이 둘은 같은 값일까? NO 전혀 다른 값이다 김성현 30 이라는 부분은 같지만 1,2 가 다르듯이
엄연히 저 둘 값은 다른것이다.


즉 여기서 말한 primaryKey 는 일종의 인덱스 값으로 생각하면된다.

그리고 이제 말하게 될 외래키(foreignKey) 는 다른테이블의 값과 연결시켜주는 역활로 생각하면 된다.

이 외래키는 1:1 / 1:N / N:1

등의 형태로도 사용될 수 있는데 무슨말이냐 하면

간단히 위의 코드를 예시로 풀면서 설명하자면

static associate(models) 
        { this.belongsTo(models.User, { foreignKey: 'userId', targetKey: 'userId' }) } }
        
        Board.init(
        {
            boardId: {
                primaryKey: true,
                type: DataTypes.INTEGER,
            },
            userId: DataTypes.INTEGER,
            title: DataTypes.STRING,
            content: DataTypes.STRING,
            image: DataTypes.STRING,
        },

여기는 board의 모델스 인데 코드를 해석해보자면,
belongsTo(models.User, 이 부분은 belongsTo 의 영어뜻 그대로 어딘가에 속해 있다 라는 의미로 사용된것이며 그 속해있는 곳은 models.User 라는 뜻이고


{ foreignKey: 'userId', targetKey: 'userId' }) } }

이 부분을 통해서 외래키로 사용될 것은 userId 이며 타겟으로 사용될 키는 userId

이다 라는 부분을 설명해 놓은것이다.

static associate(models) 
         { this.hasMany(models.Board, { foreignKey: 'userId', targetKey: 'userId' }) } }
        User.init(
        {
            userId: {
                primaryKey: true,
                type: DataTypes.INTEGER,
            },
            email: DataTypes.STRING,
            nickname: DataTypes.STRING,
            password: DataTypes.STRING,
        },

여기는 아까의 BOARD 의 모델스가 아니라 USER의 모델스인데 보드에서는 BELONGS TO 로 적힌 부분이 hasMany 로 적혀 있는 것을 볼 수 있다.

아까 보드의 모델에서는 유저 모델을 따라간다는 느낌으로 쓴거고, 여기서는 그것을 허용한다 라는 느낌으로 썻다고 이해하면 되겟다.


exports.getPost = async () => {
    return await Board.findAll({ include: { model: User, attributes: ['nickname'] } });
};

여기는 보드의 서비스 부분인데, 이 코드를 그대로 해석해보자면

Board 에서 - findAll(찾아서 붙여줄꺼야) - inclue (포함된거를) - model: User,(유저 모델스에 있는) - attributes: ['nickname'] } }); (특성이 nickname 인 것을)

라고 해석하면 되겠다.

이것을 query 문으로 다르게도 작성할 수 있지만 아쉽게도 자료가 날라가서 지금은

그냥 구글링을 해봐야겟다 ㅠㅠ


무튼 이렇게 외래키를 사용하였고 이게 바로 관계형 데이터베이스 mysql을 사용하는 이유이기도 하다.


그전까지는 관계 라는 말이 이해가 안됬었는데, 좀 날것으로 표현하자면 외래키로 다른 테이블 키와 연결한 것처럼 말 그대로 관계를 맺을 수 있어서 관계형 데이터 베이스 라고 생각하면 되겟다.


내가 유일하게 알고 있는 몽고 db는 이러한 외래키 등을 사용할 수가 없다. 왜냐하면 빅테이터를 위한 db로 사용하기 위함이지 지금처럼 관계형으로 사용할려고 만들어진게 아니기 때문이다.


물론 이전 주차까지는 몽고db의 몽구스 라는 라이브러리를 사용해서 스키마를 작성해서
마치 관계형 데이터 베이스에서 사용하는 모델을 만들고 사용했었다.

하지만 앞서 말했듯 그런 스키마는 만들어도 결정적으로 몽고 db는 외래키등을 사용할 수 없고,

보통은 몽고db는

김성현 / 30 / 백엔드 / 경력 1년
김성현 / 30 / 서울거주 / 미혼

이러한 형태로도 정해진 틀이 아닌 정보를 일단 입력한대로 수집해서 데이터가 저장이 되기 때문에 말그대로 빅데이터를 위한 용도로 만들어 졌다고 할 수 있겟다.

  • 헷갈려서 적어놓음
    라이브러리 = 가져다 쓴다
    프레임워크 = 얘가 세팅해준대로 씀
profile
삽질도 100번 하면 요령이 생긴다. 부족한 건 경험으로 채우는 백엔드 개발자

0개의 댓글