
์ฆ, ์ฌ์ฉ์ โ ํ๋ก์ ํธ โ ์์ โ ๋๊ธ ์์ผ๋ก ์ฐ๊ฒฐ๋๋ ๊ธฐ๋ณธ์ ์ธ ํ๋ก์ ํธ ๊ด๋ฆฌ ์์คํ ๊ตฌ์กฐ์ ๋๋ค.
์ด๋ฒ์ ์์ฑํ DB ์คํค๋ง๋ ์ด๋ฌํ ๊ด๊ณ์ฑ์ ๊ณ ๋ คํ์ฌ ์ค๊ณํด๋ดค์ต๋๋ค.
์ถ๊ฐ๋ก ๋ณด์ํ ๋ถ๋ถ์ด ์์ ์ ์์ผ๋, ์ด๊ธฐ ๊ธฐํ ๋จ๊ณ๋ผ๊ณ ์๊ฐํ์๊ณ ๋ด์ฃผ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.


CREATE TABLE `user` (
`id` serial NOT NULL,
`userId` string NULL,
`password` string NULL,
`name` string NULL
);
CREATE TABLE `project` (
`id` serial NOT NULL,
`projectId` string NULL,
`progress` int NULL,
`deadline` DateTime NULL,
`managerId` serial NOT NULL
);
CREATE TABLE `comment` (
`id` serial NULL,
`comment` string NULL,
`user_id` serial NOT NULL,
`task_id` serial NOT NULL
);
CREATE TABLE `task` (
`id` serial NOT NULL,
`title` string NULL,
`desc` string NULL,
`status` string NULL,
`user_ id` serial NOT NULL,
`projectId` serial NOT NULL,
`manager_id` serial NOT NULL
);
ALTER TABLE `user` ADD CONSTRAINT `PK_USER` PRIMARY KEY (
`id`
);
ALTER TABLE `project` ADD CONSTRAINT `PK_PROJECT` PRIMARY KEY (
`id`
);
ALTER TABLE `task` ADD CONSTRAINT `PK_TASK` PRIMARY KEY (
`id`
);
์ SQL ์คํค๋ง๋ฅผ ์ฐธ๊ณ ํ์ฌ Prisma ๋ชจ๋ธ ์ ์ ์ ์์ฃผ ์ฌ์ฉํ๋ ์์ฑ๋ค์ ์ ์ฉํด ๋ชจ๋ธ์ ์์ฑํฉ๋๋ค.
์ฃผ์ Prisma ์์ฑ
๊ฐ ๋ชจ๋ธ์ ํ๋๋ค์ ๋จผ์ ์ ์ํ์์ (id, userId, title, desc ๋ฑ).
Comment, Task ๋ฑ์ ๋ชจ๋ธ์์ ์ธ๋ ํค ํ๋ ์ ์ (user_id, project_id, manager_id ๋ฑ).
์ด ์์ ์๋ ๊ด๊ณ ์ค์ ์ด ๋ช
ํํ ์ ๋์ด ์์.
๊ด๊ณ๋ฅผ ๋ช
ํํ ์ง์ ํ๊ธฐ ์ํด @relation ์์ฑ์ ์ฌ์ฉํ์ฌ ์ฐธ์กฐ ์ฐ๊ฒฐ.
๊ทธ๋ฆฌ๊ณ ์ฐธ์กฐ๋ฅผ ํ๊ธฐ ์ํด์๋ ์์ฑํ์ง ์์ ์ธ๋ํค๋ ์์ฑํด์ผ ํ๋๊ฒ์ ๊บ ๋ซ๊ณ ์ถ๊ฐํ์์
1๋จ๊ณ: ๋ชจ๋ ํ๋ ์ ์
model User {
id Int @id @default(autoincrement())
userId String @unique
password String
name String
}
model Project {
id Int @id @default(autoincrement())
projectId String @unique
progress Int
deadline DateTime
managerId String
}
model Task {
id Int @id @default(autoincrement())
title String
desc String
status String
user_id
project_id
manager_id
}
model Comment {
id Int @id @default(autoincrement())
comment String
user_id
task_id
}
2๋จ๊ณ: "๋ค"์ชฝ์ ๊ด๊ณ ์ ์ ์ถ๊ฐ
model User {
id Int @id @default(autoincrement())
userId String @unique
password String
name String
comments Comment[]
projects Project[]
tasks Task[]
}
model Project {
id Int @id @default(autoincrement())
projectId String @unique
progress Int
deadline DateTime
managerId String
tasks Task[]
}
model Task {
id Int @id @default(autoincrement())
title String
desc String
status String
user_id
project_id
manager_id
comments Comment[]
}
model Comment {
id Int @id @default(autoincrement())
comment String
user_id
task_id
}
3๋จ๊ณ: "์ผ"์ชฝ ๊ด๊ณ ์ ์ ์ถ๊ฐ
model User {
id Int @id @default(autoincrement())
userId String @unique
password String
name String
comments Comment[]
projects Project[]
tasks Task[]
}
model Project {
id Int @id @default(autoincrement())
projectId String @unique
progress Int
deadline DateTime
managerId String
tasks Task[]
manager User @relation(fields: [managerId], references: [id])
}
model Task {
id Int @id @default(autoincrement())
title String
desc String
status String
projectId Int
userId Int
managerId Int
user User @relation(fields: [userId], references: [id])
project Project @relation(fields: [projectId], references: [id])
manager User @relation(fields: [projectId], references: [id])
comments Comment[]
}
model Comment {
id Int @id @default(autoincrement())
comment String
userId Int
taskId Int
user User @relation(fields: [userId], references: [id])
task Task @relation(fields: [taskId], references: [id])
}
Task ๋ชจ๋ธ์์ user์ manager ๋ชจ๋ User๋ฅผ ์ฐธ์กฐํ์ง๋ง, @relation("...") ๋ช ์๊ฐ ์์์ โ ์๋ฌ ๋ฐ์
Error: Ambiguous relation detected...
โ ํด๊ฒฐ: @relation("TaskManager") ์ฒ๋ผ ์ด๋ฆ์ ๋ช ์ํด์ผ Prisma๊ฐ ๊ตฌ๋ถ ๊ฐ๋ฅ
managerId String // โ ์ด๊ธฐ์๋ ์ด๋ ๊ฒ ๋์ด ์์์
ํ์ง๋ง User.id๋ Int์ด๋ฏ๋ก ํ์ ๋ถ์ผ์น โ ๊ด๊ณ ์ค์ ๋ถ๊ฐ๋ฅ
manager User @relation(fields: [projectId], references: [id])
- manager ๊ด๊ณ์ projectId๋ฅผ ์ฌ์ฉํด์ User๋ฅผ ์ฐธ์กฐํ๋ ๊ตฌ์กฐ โ ๋ ผ๋ฆฌ์ ์ค๋ฅ
- managerId๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ด๊ณ ๋งบ๋ ๊ฒ ์ฌ๋ฐ๋ฆ
model User {
id Int @id @default(autoincrement())
userId String @unique
password String
name String
tasks Task[] @relation("AssignedUser") // ๋ด๊ฐ ๋งก์ ์ผ
managedTasks Task[] @relation("ManagingUser") // ๋ด๊ฐ ๊ด๋ฆฌํ๋ ์ผ
comments Comment[]
projects Project[] @relation("ProjectManager") // ๋ด๊ฐ ๋ด๋นํ๋ ํ๋ก์ ํธ๋ค
}
model Project {
id Int @id @default(autoincrement())
projectId String @unique
progress Int
deadline DateTime
managerId Int
manager User @relation("ProjectManager", fields: [managerId], references: [id])
tasks Task[]
}
model Task {
id Int @id @default(autoincrement())
title String
desc String
status String
projectId Int
userId Int
managerId Int
user User @relation("AssignedUser", fields: [userId], references: [id])
manager User @relation("ManagingUser", fields: [managerId], references: [id])
project Project @relation(fields: [projectId], references: [id])
comments Comment[]
}
model Comment {
id Int @id @default(autoincrement())
comment String
userId Int
taskId Int
user User @relation(fields: [userId], references: [id])
task Task @relation(fields: [taskId], references: [id])
}
SQL์ ํ ๋๋ก ๋ง๋ model ์ ๋๋ค. ํ์์ ๋ฐ๋ผ @unique ์ not Null๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
serial โ Int @default(autoincrement())
SQL์ serial ํ์
์ Prisma์์ Int @default(autoincrement())๋ก ๋ณํ๋ฉ๋๋ค.
โ ์๋ ์ฆ๊ฐํ๋ ์ ์ํ ๊ธฐ๋ณธ ํค๋ฅผ ์๋ฏธํฉ๋๋ค.
string NULL โ String?
SQL์์ string NULL๋ก ์ ์๋ ํ๋๋ Prisma์์๋ String? (์ ํ์ ํ๋)๋ก ์ฒ๋ฆฌํฉ๋๋ค.
โ ๊ฐ์ด ์์ด๋ ๋๋ optional ํ๋์
๋๋ค.
๊ธฐ๋ณธ ์ธ๋ํค ๊ด๊ณ
SQL์ ์ธ๋ํค ํ๋๋ Prisma์์ ๋ค์๊ณผ ๊ฐ์ด ํํ๋ฉ๋๋ค:
userId Int
user User @relation(fields: [userId], references: [id])
โ userId๋ ์ธ๋ํค ํ๋์ด๋ฉฐ, ์ค์ ๊ด๊ณ๋ @relation์ผ๋ก ์ ์๋ฉ๋๋ค.
Comment๋ User์ Task๋ฅผ ์ฐธ์กฐํฉ๋๋ค:
model Comment {
id Int @id @default(autoincrement())
comment String?
userId Int
taskId Int
user User @relation(fields: [userId], references: [id])
task Task @relation(fields: [taskId], references: [id])
}
@mapSQL์์๋ ์ข
์ข
ํ๋๋ช
์ด user_id์ฒ๋ผ snake_case๋ก ๋์ด ์์ต๋๋ค.
Prisma์์๋ camelCase(userId)๋ก ํ๋๋ช
์ ๋ฐ๊พธ๋, ์ค์ DB ์ปฌ๋ผ๋ช
๊ณผ ๋งคํํด์ฃผ๊ธฐ ์ํด @map()์ ์ฌ์ฉํฉ๋๋ค.
์์:
userId Int @map("user_id")
@relation("...")) ๋ช
์Prisma์์๋ ํ๋์ ๋ชจ๋ธ์ด ๋์ผํ ๋์ ๋ชจ๋ธ์ ๋ ๋ฒ ์ด์ ์ฐธ์กฐํ๋ฉด ์๋์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค:
Error validating model "Task": Ambiguous relation detected...
์ด๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๊ฐ ๊ด๊ณ์ ๋ช ํํ ์ด๋ฆ์ ๋ช ์ํด์ผ ํฉ๋๋ค.
์์:
model Task {
managerId Int
userId Int
user User @relation(fields: [userId], references: [id])
manager User @relation("TaskManager", fields: [managerId], references: [id])
}
model User {
tasksManaged Task[] @relation("TaskManager")
}
โก๏ธ @relation("TaskManager")์ฒ๋ผ ์ด๋ฆ์ ์ง์ ํ๋ฉด Prisma๊ฐ ๊ด๊ณ๋ฅผ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
ERD์ SQL์ ์ฐธ๊ณ ํด Prisma ๋ชจ๋ธ๋ก ๋ฐ๊พธ๋ฉด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ฅผ ์ฝ๋๋ก ์ฝ๊ฒ ํํํ ์ ์์ต๋๋ค.
SQL์ Prisma ๋ฌธ๋ฒ์ผ๋ก ๋ณํํ๋ ์ฐ์ต์ ํ๊ณ , ์๋ชป๋ ๋ถ๋ถ์ ์ฐพ์ ์์ ํด๊ฐ๋ฉฐ ๊ณต๋ถํ๋ฉด Prisma ๋ชจ๋ธ ์ค๊ณ ๋ฌธ๋ฒ์ ์ ์ ์ต์ํด์ง ๊ฑฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค.