[ Node.js ์ˆ™๋ จ์ฃผ์ฐจ1 (1-13)] Prisma ๊ฒŒ์‹œํŒ ์‚ฌ์ดํŠธ ์„ค๊ณ„ ( ์™ธ๋ž˜ํ‚ค, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๊ณ„ )

2023. 9. 6. 01:39ใ†3. Node.js

๋‚˜๋งŒ์˜ ๊ฒŒ์‹œํŒ ์‚ฌ์ดํŠธ ์„ค๊ณ„

 

https://drawsql.app/teams/no-55/diagrams/prisma-community-hub

 

Prisma-Community-Hub | DrawSQL

Database schema diagram for Prisma-Community-Hub.

drawsql.app

์‹œ์Šคํ…œ์˜ ๊ตฌ์„ฑ์ด ๋ฌด์—‡์ด๊ณ  ์–ด๋– ํ•œ ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌ์ƒํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ERD

 


๋‚˜๋งŒ์˜ ๊ฒŒ์‹œํŒ ์‚ฌ์ดํŠธ ์„ค๊ณ„

[ ํ…Œ์ด๋ธ” ๊ด€๊ณ„ ๋ฐ ์š”๊ตฌ์‚ฌํ•ญ ]

์‚ฌ์šฉ์ž(Users)๋Š” 1๊ฐœ์˜ ์‚ฌ์šฉ์ž ์ •๋ณด(UserInfo)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Users ํ…Œ์ด๋ธ”๊ณผ UserInfo ํ…Œ์ด๋ธ”์€ 1:1 ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

์‚ฌ์šฉ์ž(Users)๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฒŒ์‹œ๊ธ€(Posts)์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Users ํ…Œ์ด๋ธ”๊ณผ Posts ํ…Œ์ด๋ธ”์„ 1:N ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

์‚ฌ์šฉ์ž(Users)๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋Œ“๊ธ€(Comments)์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Users ํ…Œ์ด๋ธ”๊ณผ Comments ํ…Œ์ด๋ธ”์€ 1:N ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

ํ•˜๋‚˜์˜ ๊ฒŒ์‹œ๊ธ€(Posts**)์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋Œ“๊ธ€(Comments)**์ด ์ž‘์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Posts ํ…Œ์ด๋ธ”๊ณผ Comments ํ…Œ์ด๋ธ”์€ 1:N ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 


 

 

[ ์‚ฌ์šฉ์ž(User) ์š”๊ตฌ์‚ฌํ•ญ ํ…Œ์ด๋ธ” ]

1. ์‚ฌ์šฉ์ž(Users) ํ…Œ์ด๋ธ”

// ์‚ฌ์šฉ์ž(Users) ํ…Œ์ด๋ธ”
// userId (PK)	INTEGER	NOT NULL	AUTO_INCREMENT 
// email	STRING	NOT NULL	
// password	STRING	NOT NULL	
// createdAt	DATETIME	NOT NULL	ํ˜„์žฌ ์‹œ๊ฐ„
// updatedAt	DATETIME	NOT NULL	ํ˜„์žฌ ์‹œ๊ฐ„

2. ๊ฒŒ์‹œ๊ธ€(Posts) ํ…Œ์ด๋ธ”

// [์š”๊ตฌ์‚ฌํ•ญ] ์‚ฌ์šฉ์ž(Users) ํ…Œ์ด๋ธ”
// postId (PK)	INTEGER	NOT NULL	AUTO_INCREMENT
// title	STRING	NOT NULL	
// content	TEXT	NOT NULL	
// createdAt	DATETIME	NOT NULL	ํ˜„์žฌ ์‹œ๊ฐ„
// updatedAt	DATETIME	NOT NULL	ํ˜„์žฌ ์‹œ๊ฐ„

3. ์‚ฌ์šฉ์ž ์ •๋ณด(UsersInfos) ํ…Œ์ด๋ธ”

// [์š”๊ตฌ์‚ฌํ•ญ] ์‚ฌ์šฉ์ž(Users) ํ…Œ์ด๋ธ”
// userInfoId (PK)	INTEGER	NOT NULL	AUTO_INCREMENT
// name	STRING	NOT NULL	
// age	INTEGER	NULL	
// gender	STRING	NOT NULL	
// profileImage	STRING	NULL	
// createdAt	DATETIME	NOT NULL	ํ˜„์žฌ ์‹œ๊ฐ„
// updatedAt	DATETIME	NOT NULL	ํ˜„์žฌ ์‹œ๊ฐ„

4. ๋Œ“๊ธ€(Comments) ํ…Œ์ด๋ธ”

// [์š”๊ตฌ์‚ฌํ•ญ] ๋Œ“๊ธ€(Comments) ํ…Œ์ด๋ธ”
// commentId (PK)	INTEGER	NOT NULL	AUTO_INCREMENT
// content	STRING	NOT NULL	
// createdAt	DATETIME	NOT NULL	ํ˜„์žฌ ์‹œ๊ฐ„
// updatedAt	DATETIME	NOT NULL	ํ˜„์žฌ ์‹œ๊ฐ„

[ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ฅธ, schema.prisma ๋ชจ๋ธ ]

// prisma/schema.prisma

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider = "prisma-client-js"
}

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

model Users {
  userId    Int      @id @default(autoincrement()) @map("userId")
  email     String   @unique @map("email")
  password  String   @map("password")
  createdAt DateTime @default(now()) @map("createdAt")
  updatedAt DateTime @updatedAt @map("updatedAt")

  @@map("Users")
}

model Posts {
  postId    Int      @id @default(autoincrement()) @map("postId")
  title     String   @map("title")
  content   String   @map("content") @db.Text
  createdAt DateTime @default(now()) @map("createdAt")
  updatedAt DateTime @updatedAt @map("updatedAt")

  @@map("Posts")
}

model UserInfos {
  userInfoId   Int      @id @default(autoincrement()) @map("userInfoId")
  name         String   @map("name")
  age          Int?     @map("age")
  gender       String   @map("gender")
  profileImage String?  @map("profileImage")
  createdAt    DateTime @default(now()) @map("createdAt")
  updatedAt    DateTime @updatedAt @map("updatedAt")

  @@map("UserInfos")
}

model Comments {
  commentId Int      @id @default(autoincrement()) @map("commentId")
  content   String   @map("content")
  createdAt DateTime @default(now()) @map("createdAt")
  updatedAt DateTime @updatedAt @map("updatedAt")

  @@map("Comments")
}

[Prisma 1:1 ๊ด€๊ณ„]

์‚ฌ์šฉ์ž(Users) ๋ชจ๋ธ์€ ์‚ฌ์šฉ์ž ์ •๋ณด(UserInfos) ๋ชจ๋ธ๊ณผ 1:1 ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. 

1:1 ๊ด€๊ณ„๋ž€ ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ํ•˜๋‚˜์˜ ์‚ฌ์šฉ์ž ์ •๋ณด๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ , ํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๋Š” ํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ์†ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

 

 

1:1๊ด€๊ณ„๋ฅผ ์„ค์ •ํ• ๋•Œ๋Š” ์•„๋ž˜์˜ ๋‚ด์šฉ์„ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค.

๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๋ ค๋Š” ๋ชจ๋ธ(UserInfos)์—์„œ ์–ด๋–ค ๋ชจ๋ธ๊ณผ ๊ด€๊ณ„๋ฅผ ๋งบ์„์ง€(Users) ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ด€๊ณ„๋ฅผ ๋งบ๊ฒŒ๋˜๋Š” ๋ชจ๋ธ(Users)์—์„œ ์–ด๋–ค ๋ชจ๋ธ์ด ๊ด€๊ณ„๋ฅผ ๋งบ๋Š”์ง€(UserInfos) ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ด€๊ณ„๋ฅผ ๋งบ๊ฒŒ๋˜๋Š” ๋ชจ๋ธ(Users)์—์„œ, ํƒ€์ž…์„ ์ง€์ •ํ•  ๋•Œ, Optional Parameter(?)๋ฅผ ์ง€์ •ํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.

// schema.prisma 

model Users {
  userId    Int      @id @default(autoincrement()) @map("userId")
  email     String   @unique @map("email")
  password  String   @map("password")
  createdAt DateTime @default(now()) @map("createdAt")
  updatedAt DateTime @updatedAt @map("updatedAt")

  UserInfos UserInfos? // ์‚ฌ์šฉ์ž(Users) ํ…Œ์ด๋ธ”๊ณผ ์‚ฌ์šฉ์ž ์ •๋ณด(UserInfos) ํ…Œ์ด๋ธ”์ด 1:1 ๊ด€๊ณ„๋ฅผ ๋งบ์Šต๋‹ˆ๋‹ค.
//  userinfos์ด๊ธด ํ•˜์ง€๋งŒ, ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌ ํ•˜์ง€ ์•Š์„์ˆ˜๋„ ์žˆ๋‹ค ๋ผ๋Š”๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ„. 
// ์‚ฌ์šฉ์ž์™€ ์‚ฌ์šฉ์ž์ •๋ณด๊ฐ€ ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ์žˆ๋‹ค๋Š”๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ„
// model Users๋Š” ์—ฐ๊ด€๊ด€๊ณ„์ •์˜์˜ ์ปฌ๋Ÿผ์ผ๋ฟ, ์ปฌ๋Ÿผ์€ ์ƒ๊ธฐ์ง€์•Š์Œ!!!!!! 
  
  @@map("Users")
}


model UserInfos {
  userInfoId   Int      @id @default(autoincrement()) @map("userInfoId")
  UserId       Int      @unique @map("UserId") // ์‚ฌ์šฉ์ž(Users) ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•˜๋Š” ์™ธ๋ž˜ํ‚ค
  name         String   @map("name")
  age          Int?     @map("age")
  gender       String   @map("gender")
  profileImage String?  @map("profileImage")
  createdAt    DateTime @default(now()) @map("createdAt")
  updatedAt    DateTime @updatedAt @map("updatedAt")

  // Users ํ…Œ์ด๋ธ”๊ณผ ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  User Users @relation(fields: [UserId], references: [userId], onDelete: Cascade)
// model user/info user์˜ userid๊ด€๊ณ„์„ค์ •
// ๋‚˜๋Š” ์‚ฌ์šฉ์ž์ •๋ณดํ…Œ์ด๋ธ”์—์žˆ๋Š” UserId ์ปฌ๋Ÿผ์€ ์œ ์ €์Šคํ…Œ์ด๋ธ”์—์žˆ๋Š” ์œ ์ €์•„์ด๋”” ์ปฌ๋Ÿผ์„ ์ฐธ์กฐํ• ๊ฑฐ๋‹ค.
onDelete: Cascade -> ์‚ฌ์šฉ์ž์ •๋ณด๊ฐ€ ์‚ญ์ œ๋˜๋ฉด ์ •๋ณด๋„ ์‚ญ์ œ๋œ๋‹ค.
  @@map("UserInfos")
}

์‚ฌ์šฉ์ž ์ •๋ณด(UserInfos) ๋ชจ๋ธ์— ์„ค์ •

 

Users : ์ผ๋ฐ˜์ ์ธ Int, String๊ณผ ๊ฐ™์€ ํƒ€์ž…์ด ์•„๋‹Œ, ์ฐธ์กฐํ•  ๋‹ค๋ฅธ ๋ชจ๋ธ์„ ์ง€์ •

์‚ฌ์šฉ์ž(Users) ๋ชจ๋ธ์„ ์ฐธ์กฐํ•˜๋ฏ€๋กœ Users๋กœ ์ž‘์„ฑ๋˜์–ด์žˆ๋‹ค.

 

fields : ์‚ฌ์šฉ์ž ์ •๋ณด(UserInfos) ๋ชจ๋ธ์—์„œ ์‚ฌ์šฉํ•  ์™ธ๋ž˜ํ‚ค(Forien Key) ์ปฌ๋Ÿผ์„ ์ง€์ •.

์—ฌ๊ธฐ์„ , UserId ์ปฌ๋Ÿผ์œผ๋กœ ์™ธ๋ž˜ํ‚ค๋ฅผ ์ง€์ •.

 

references : key: ์ฐธ์กฐํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋ธ์˜ Column๋ฅผ ์ง€์ •.

์—ฌ๊ธฐ์„ , ์‚ฌ์šฉ์ž(Users) ๋ชจ๋ธ์˜ userId ์ปฌ๋Ÿผ์„ ์ฐธ์กฐ.

 

onDelete | onUpdate : ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋ธ์ด ์‚ญ์ œ or ์ˆ˜์ •๋  ๊ฒฝ์šฐ ์–ด๋–ค ํ–‰์œ„๋ฅผ ํ•  ์ง€ ์„ค์ •.

Cascade ์˜ต์…˜์„ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ญ์ œ๋  ๊ฒฝ์šฐ ๊ทธ์— ์—ฐ๊ฒฐ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด๋„ ํ•จ๊ป˜ ์‚ญ์ œ๋˜๋„๋ก ์„ค์ •.

 


[Prisma 1:N ์—ฐ๊ด€ ๊ด€๊ณ„]

๊ฒŒ์‹œ๊ธ€(Posts) ๋ชจ๋ธ์€ ์‚ฌ์šฉ์ž(Users) ๋ชจ๋ธ๊ณผ N:1 ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ, 1:N ๊ด€๊ณ„๋ž€ ํ•œ ์‚ฌ์šฉ์ž๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฒŒ์‹œ๊ธ€์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

1:N ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•  ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์„ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค.

๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๋ ค๋Š” ๋ชจ๋ธ(Posts)์—์„œ ์–ด๋–ค ๋ชจ๋ธ๊ณผ ๊ด€๊ณ„๋ฅผ ๋งบ์„์ง€(Users) ์„ค์ •

๊ด€๊ณ„๋ฅผ ๋งบ๊ฒŒ๋˜๋Š” ๋ชจ๋ธ(Users)์—์„œ ์–ด๋–ค ๋ชจ๋ธ์ด ๊ด€๊ณ„๋ฅผ ๋งบ๋Š”์ง€(Posts) ์„ค์ •

๊ด€๊ณ„๋ฅผ ๋งบ๊ฒŒ๋˜๋Š” ๋ชจ๋ธ(Users)์—์„œ, ํƒ€์ž…์„ ์ง€์ •ํ•  ๋•Œ, ๋ฐฐ์—ด ์—ฐ์‚ฐ์ž([])๋ฅผ ์ž‘์„ฑ

 

// schema.prisma

generator client {
  provider = "prisma-client-js"
}

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

model Users {
  userId    Int      @id @default(autoincrement()) @map("userId")
  email     String   @unique @map("email")
  password  String   @map("password")
  createdAt DateTime @default(now()) @map("createdAt")
  updatedAt DateTime @updatedAt @map("updatedAt")

  UserInfos UserInfos? // ์‚ฌ์šฉ์ž(Users) ํ…Œ์ด๋ธ”๊ณผ ์‚ฌ์šฉ์ž ์ •๋ณด(UserInfos) ํ…Œ์ด๋ธ”์ด 1:1 ๊ด€๊ณ„๋ฅผ ๋งบ์Šต๋‹ˆ๋‹ค.
  Posts     Posts[] // ์‚ฌ์šฉ์ž(Users) ํ…Œ์ด๋ธ”๊ณผ ๊ฒŒ์‹œ๊ธ€(Posts) ํ…Œ์ด๋ธ”์ด 1:N ๊ด€๊ณ„๋ฅผ ๋งบ์Šต๋‹ˆ๋‹ค.
  Comments  Comments[] // ์‚ฌ์šฉ์ž(Users) ํ…Œ์ด๋ธ”๊ณผ ๋Œ“๊ธ€(Comments) ํ…Œ์ด๋ธ”์ด 1:N ๊ด€๊ณ„๋ฅผ ๋งบ์Šต๋‹ˆ๋‹ค.

  @@map("Users")
}

model Posts {
  postId    Int      @id @default(autoincrement()) @map("postId")
  UserId    Int      @map("UserId") // ์‚ฌ์šฉ์ž(Users) ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•˜๋Š” ์™ธ๋ž˜ํ‚ค
  title     String   @map("title")
  content   String   @map("content") @db.Text
  createdAt DateTime @default(now()) @map("createdAt")
  updatedAt DateTime @updatedAt @map("updatedAt")

  // Users ํ…Œ์ด๋ธ”๊ณผ ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  User     Users      @relation(fields: [UserId], references: [userId], onDelete: Cascade)
  Comments Comments[] // ๊ฒŒ์‹œ๊ธ€(Posts) ํ…Œ์ด๋ธ”๊ณผ ๋Œ“๊ธ€(Comments) ํ…Œ์ด๋ธ”์ด 1:N ๊ด€๊ณ„๋ฅผ ๋งบ์Šต๋‹ˆ๋‹ค.

  @@map("Posts")
}

model UserInfos {
  userInfoId   Int      @id @default(autoincrement()) @map("userInfoId")
  UserId       Int      @unique @map("UserId") // ์‚ฌ์šฉ์ž(Users) ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•˜๋Š” ์™ธ๋ž˜ํ‚ค
  name         String   @map("name")
  age          Int?     @map("age")
  gender       String   @map("gender")
  profileImage String?  @map("profileImage")
  createdAt    DateTime @default(now()) @map("createdAt")
  updatedAt    DateTime @updatedAt @map("updatedAt")

  // Users ํ…Œ์ด๋ธ”๊ณผ ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  User Users @relation(fields: [UserId], references: [userId], onDelete: Cascade)

  @@map("UserInfos")
}

model Comments {
  commentId Int      @id @default(autoincrement()) @map("commentId")
  PostId    Int      @map("PostId") // ๊ฒŒ์‹œ๊ธ€(Posts) ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•˜๋Š” ์™ธ๋ž˜ํ‚ค
  UserId    Int      @map("UserId") // ์‚ฌ์šฉ์ž(Users) ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•˜๋Š” ์™ธ๋ž˜ํ‚ค
  content   String   @map("content")
  createdAt DateTime @default(now()) @map("createdAt")
  updatedAt DateTime @updatedAt @map("updatedAt")

  // Posts ํ…Œ์ด๋ธ”๊ณผ ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  Post Posts @relation(fields: [PostId], references: [postId], onDelete: Cascade)
  // Users ํ…Œ์ด๋ธ”๊ณผ ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  User Users @relation(fields: [UserId], references: [userId], onDelete: Cascade)

  @@map("Comments")
}

 

 

* ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ @relation

๊ฒŒ์‹œ๊ธ€ ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ ์ž‘์„ฑํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ํšŒ์› ํƒˆํ‡ด(onDelete)ํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ ์ž‘์„ฑํ•œ ๋ชจ๋“  ๊ฒŒ์‹œ๊ธ€์ด ์‚ญ์ œ๋˜๋„๋ก ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค. ์ด๋Ÿฐ ์„ค์ •์€ @relation ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •ํ•œ๋‹ค.

// Users ํ…Œ์ด๋ธ”๊ณผ ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
User     Users      @relation(fields: [UserId], references: [userId], onDelete: Cascade)

User๋Š” ๊ฒŒ์‹œ๊ธ€(Posts)์ด ์ฐธ์กฐํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋ธ์„ ์ง€์ •ํ•˜๊ณ , fields๋Š” ๊ฒŒ์‹œ๊ธ€(Posts) ๋ชจ๋ธ์—์„œ ์‚ฌ์šฉํ•  ์™ธ๋ž˜ํ‚ค ์ปฌ๋Ÿผ์„ ์ง€์ •ํ•œ๋‹ค.

references๋Š” ์ฐธ์กฐํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋ธ์˜ ์ปฌ๋Ÿผ์„ ์ง€์ •ํ•˜๊ณ , onDelete๋Š” ์ž ์กฐํ•˜๋Š” ๋ชจ๋ธ์ด ์‚ญ์ œ๋  ๊ฒฝ์šฐ ์–ด๋–ค ํ–‰์œ„๋ฅผ ํ•  ์ง€ ์„ค์ •ํ•œ๋‹ค.

onDelete์˜ ๊ฒฝ์šฐ, Cascade ์˜ต์…˜์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ญ์ œ๋  ๊ฒฝ์šฐ ์—ฐ๊ด€๋œ ๊ฒŒ์‹œ๊ธ€ ๋˜ํ•œ ์‚ญ์ œ๋œ๋‹ค.