프로젝트 진행하기에 앞서 본격적인 스키마 작성 전 ERD 작성
하나의 user는 여러개의 post를 작성할 수 있다.
하나의 post는 하나의 유저만 가질 수 있다.
하나의 user는 여러명을 following 할 수 있다.
하나의 following은 여러 user로 following 받을 수 있다.
하나의 user는 여러개의 (포스트에) like를 할 수 있다.
하나의 like는 하나의 user(like를 한 주체) 만 가질 수 있다.
하나의 user는 여러개의 (포스트에) saved를 할 수 있다.
하나의 saved는 하나의 user(saved를 한 주체) 만 가질 수 있다.
하나의 user는 여러개의 comment를 달 수 있다.
하나의 comment는 하나의 유저만 가질 수 있다.
하나의 post는 여러개의 comment가 달릴 수 있다.
하나의 comment는 하나의 post에만 달 수 있다.
하나의 post는 여러개의 hashtag를 가질 수 있다.
하나의 hashtag는 여러개의 post에 달릴 수 있다.
하나의 post는 여러개의 like를 가질 수 있다.
하나의 likes는 여
하나씩 추가해야겠다. 어렵다.
Table users {
id int [pk, increment]
email varchar [unique]
nickname varchar [unique]
password varchar
profileImage varchar
bio text
createdAt timestamp [default: `date.now()`] // Default value: current time
updatedAt timestamp [default: `date.now()`]
}
Table follow {
followId int
followingId int
followerId int
}
Table posts {
id int [pk, increment]
authorId int [unique]
content text
commentCount int
likeCount int
createdAt datetime [default: `date.now()`]
updatedAt datetime [default: `date.now()`]
}
Table hashtags {
id int [pk, increment]
hashtag varchar
}
Table post_hashtag {
id int [pk, increment]
hashtag int
postId int
}
Table comment {
id int [pk, increment]
userId int [unique]
postId int [unique]
content text
createdAt datetime [default: `date.now()`]
}
Table likes {
id int [pk, increment]
userId int
postId int
createdAt datetime [default: `date.now()`]
}
Table saved {
id int [pk, increment]
postId int [unique]
userId int [unique]
}
Ref: "users"."id" < "posts"."id"
Ref: "users"."id" < "follow"."followingId"
Ref: "users"."id" < "follow"."followerId"
Ref: "posts"."id" < "comment"."postId"
Ref: "posts"."id" < "likes"."postId"
Ref: "users"."id" < "likes"."userId"
Ref: "users"."id" < "comment"."userId"
Ref: "post_hashtag"."hashtag" > "hashtags"."id"
Ref: "posts"."id" < "post_hashtag"."postId"
Ref: "posts"."id" < "saved"."postId"
Ref: "users"."id" < "saved"."userId"
model User {
id String @id @default(uuid())
email String @unique
name String?
password String?
image String?
bio String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
sessions Session[]
posts Post[] @relation("UserPosts")
following Follow[] @relation("Following")
followers Follow[] @relation("Followers")
comments Comment[] @relation("UserComments")
likes Like[] @relation("UserLikes")
}
model Session {
sessionToken String @unique
userId String
expires DateTime
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Post {
id String @id @default(uuid())
userId String
title String
content String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation("UserPosts", fields: [userId], references: [id], onDelete: Cascade)
comments Comment[] @relation("PostComments")
likes Like[] @relation("PostLikes")
hashtags PostHashtag[] @relation("PostHashtags")
}
model Hashtag {
id String @id @default(uuid())
title String @unique // 해시태그 제목 (예: #technology, #fashion 등)
posts PostHashtag[] @relation("PostHashtags") // 양쪽 모델에 관계 필드 존재 필요
}
model PostHashtag {
postId String
hashtagId String
post Post @relation("PostHashtags", fields: [postId], references: [id], onDelete: Cascade) // "PostHashtags"로 이름 매칭
hashtag Hashtag @relation("PostHashtags", fields: [hashtagId], references: [id], onDelete: Cascade) // "PostHashtags"로 이름 매칭
@@id([postId, hashtagId]) // 복합 기본 키 설정
}
model Comment {
id String @id @default(uuid())
userId String
postId String
content String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation("UserComments", fields: [userId], references: [id], onDelete: Cascade)
post Post @relation("PostComments", fields: [postId], references: [id], onDelete: Cascade)
}
model Follow {
id String @id @default(uuid())
followingId String
followerId String
// User 관계
following User @relation("Followers", fields: [followingId], references: [id], onDelete: Cascade)
follower User @relation("Following", fields: [followerId], references: [id], onDelete: Cascade)
@@unique([followingId, followerId])
}
model Like {
id String @id @default(uuid())
userId String
postId String
createdAt DateTime @default(now())
user User @relation("UserLikes", fields: [userId], references: [id], onDelete: Cascade)
post Post @relation("PostLikes", fields: [postId], references: [id], onDelete: Cascade)
@@unique([userId, postId]) // userId와 postId를 복합 유니크 제약
}
다시 정리좀 하자
model User {
id Int @id @default(autoincrement())
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
author User @relation(fields: [authorId], references: [id])
authorId Int
}
User 테이블에
posts Post[]를 넣어줌으로서
User와 Post는 1:N 관계가 된거고
Post의 id는 그냥 식별용 고유 id이고
author는 User 객체 전체를 참조하고
fields: [authorId는 User의 id를 참조한다]~
Should a like be treated as a separate entity with its own attributes, or can it simply be represented as a boolean build now gg field within the posts table to indicate whether it has been liked?