본문 바로가기
IT관련/DB(데이터베이스) 관련

Prisma를 이용하여 mysql기능을 이용해보자 ! (Foreign Key Constraints - 외래키제약)

728x90

이전 글 : https://heokknkn.tistory.com/25

 

안녕하세요 !!! 

이번엔 저번 글에 이어서 Prisma를 사용하면서 mysql의 기능 중 하나인 Foreign Key Constraints

 

먼저 간략하게 외래키에 설명을 하겠습니다 ! 

밑에와 같은 그림이 있습니다 !! 

그림에서 보시면 product에서 ID가 1번인녀석은 user가 1인 녀석이 등록을 했다는것을 알 수 있습니다 ! 

이처럼 외부에서 다른 테이블을 식별할 수 있는 키를 외래키라고 합니다 !! 

그럼 외래키제약은 무엇일까요??? 

 

 

Foreign Key Constraints 외래키 제약이란?

 

기본적으로 mysql에서는 외래키 제약을 지원해줍니다 !!! 

이게 무엇이냐면 관계형 데이타베이스는 테이블에 데이터를 추가·갱신할 때의 제약의 하나로, 외부의 다른 테이블의  특정의 열의 값 밖에 지정할 수 없게 하는 것 입니다 !!! 

 

응?? 이라고 하실수도 있는데요 !! 만약에 저 위에서 유저가 1명만 등록 된 상태라고 해봅시다 ! 

그러고 그런데 !!! 밑에 그림처럼 product의 User등록 ID를 1이 아닌 2나 3 ... 등등 User에 등록되지 않는 번호가 등록된다면??

6은 없는데???? 어떻게 등록할거야?

위에 그림에 쓴 설명처럼 mysql에서는 에러가 나면서 등록을 하지 못하게 해줍니다 !!! 

 

하지만 !! 저희는 prisma의 vitess​는 mysql과 비슷하지만 mysql이 아닙니다 !!! ( mysql-compatibale(호환) 데이터베이스다​)

vitess에 대해서 잠깐 설명하고 넘어가보겠습니다 ! 

vitess는 대량의 connections, table과 다양한 서버들을 scaling 를 할 수 있다.(굳굳굳)

vitess는 scalability(확장성)에 특화! 그래서 vitess는 데이터베이스를 잘게 쪼개서 여러 서버에 분산시키는 데에 특화 됐습니다 !!

이게 특별한 점이지만 ! 결과적으로 vitess mysql이 아니기 때문에 mysql은 외래키제약을 지원하지만 vitess가 하지 않는것들이 있습니다.( 바로 위에서 말한것들..... 외래키 제약이라던가... )

 

그러니까 저런 경우에 vitess는 product를 생성하기 전에 사용자가 존재하지 않는지 확인하지 않습니다 ! 그건 바로 ! vitess foreign key constraint( 외래키 제약)을 지원하지 않기 때문 !

 

 

그래서 보통은 mysql이나 postgresql에 도움을 받지만 vitess에게는 그런 도움을 받을 수 없습니다 ㅜㅜ 

그래도 저런경우는 등록을 못하게 막아야겠죠????  그러면 어떻게 해야할까요?? 

 

바로 prisma의 힘을 빌리면 됩니다 !! 바로 제가 알려드리겠습니다 !! 

 단 2줄이면 가능합니다 !!!! 그러니 바로 적용해두면서 저런 경우에 대해서 방지합시다 ! 

바로 아래처럼 적용해주세요 ! 

schema.prisma에서 

generator client안에 밑에를 추가 ! 
previewFeatures = ["referentialIntegrity"]
datasource db안에 밑에를 추가 ! 
referentialIntegrity = "prisma"

 

밑에는 전체적인 소스 입니다 ! 

generator client {
  provider        = "prisma-client-js"
  previewFeatures = ["referentialIntegrity"]
}

datasource db {
  provider             = "mysql"
  url                  = env("DATABASE_URL")
  referentialIntegrity = "prisma"
}

 

저렇게 2줄을 추가하면 손쉽게 mysql에 외래키제약의 기능을 사용 할 수 있습니다 !!!! 

 

 

자 오늘은 여기까지입니다 !!! 

저 윗부분에 대해서는 테스트의 결과는 나중에 보여드리겠습니다 !! ( 꼭입니다 !! 아직 배우는 단계라서 테스트는 못해봤네요 ㅜㅜ  )

 

그럼 다음시간에 더 유용한 정보들을 가지고 다시 오겠습니다 ^^ 

항상 감사합니다 !  

 

728x90