프로젝트 : 스키마 디자인

Hunter Joe·2024년 12월 17일
0

프로젝트 진행하기에 앞서 본격적인 스키마 작성 전 ERD 작성

DB 설계

users


users : posts = 1: N

하나의 user는 여러개의 post를 작성할 수 있다.
하나의 post는 하나의 유저만 가질 수 있다.

users : follow = N : M

하나의 user는 여러명을 following 할 수 있다.
하나의 following은 여러 user로 following 받을 수 있다.

users : likes = 1 : N

하나의 user는 여러개의 (포스트에) like를 할 수 있다.
하나의 like는 하나의 user(like를 한 주체) 만 가질 수 있다.

users : saved = 1 : N

하나의 user는 여러개의 (포스트에) saved를 할 수 있다.
하나의 saved는 하나의 user(saved를 한 주체) 만 가질 수 있다.

users : comment : 1 : N

하나의 user는 여러개의 comment를 달 수 있다.
하나의 comment는 하나의 유저만 가질 수 있다.

posts

posts : comments = 1 : N

하나의 post는 여러개의 comment가 달릴 수 있다.
하나의 comment는 하나의 post에만 달 수 있다.

post : hastag = N : N

하나의 post는 여러개의 hashtag를 가질 수 있다.
하나의 hashtag는 여러개의 post에 달릴 수 있다.

post : likes =

하나의 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"

Prisma 그냥 짠거

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를 참조한다]~

profile
Async FE 취업 준비중.. Await .. (취업완료 대기중) ..

2개의 댓글

comment-user-thumbnail
2024년 12월 30일

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?

1개의 답글