본문 바로가기

개발 공부

Prisma 스키마 (2) - 인덱스, 유니크, 복합키

 

 “@@”

  • @ → 필드 단위 설정 (예: @id, @default(now()))
  • @@ → 모델 단위 설정 (예: @@index, @@unique, @@id)

즉, @@something은 모델 전체에 영향을 주는 규칙입니다.

 


 

@@index — 검색 속도를 높인다

@@index([userId, postId])

의미

이 두 컬럼(userId, postId)을 자주 같이 검색하니, DB 빠르게 찾을 수 있도록 색인을 만들어둬

  • 쿼리 속도 향상 (특히 WHERE 조건에 두 컬럼을 함께 쓸 때)
  • 예를 들어, 다음 쿼리가 훨씬 빨라짐:
  • SELECT * FROM Like WHERE userId = 'u1' AND postId = 'p1';

사용 예시

model Like {
  id        String @id @default(cuid())
  userId    String
  postId    String
  @@index([userId, postId])
}
  • 자주 조회되는 조합에 인덱스를 걸어두면 탐색 시간이 크게 줄어듭니다.
  • 인덱스는 검색 최적화용이며, 중복을 막지는 않습니다.

 


 

 @@unique — 중복 데이터를 막는다

@@unique([userId, postId])

의미

  • 같은 유저(userId)가 같은 글(postId)에 대해 중복 데이터를 넣지 못하게 막자.
  • 유니크 제약 조건(Unique Constraint) 생성 → 같은 조합으로는 데이터 추가 불가.

 

 

예시

 

userId postId
u1 p1
u1 p2
u2 p1
  • 가능 — 모두 다른 조합.
  • 불가능 — u1, p1을 또 추가하려 하면 DB에서 오류 발생.
  • @@unique([userId, postId])는 좋아요, 팔로우, 북마크 등 중복 액션 방지에 매우 유용.
  • Unique 제약 조건은 내부적으로 인덱스도 자동 생성하므로 조회도 빠릅니다.

 


 

@@id — 복합 기본키 (Composite Primary Key)

@@id([followerId, followingId])

의미

이 두 컬럼을 합쳐서 하나의 고유 ID로 취급하겠다.

 

예시: Follows 테이블

model Follows {
  followerId  String
  followingId String
  createdAt   DateTime @default(now())

  @@id([followerId, followingId])
}

 

followerId followingId
u1 u2
u2 u3

 

  • 가능 — 조합이 다름.
  • 불가능 — u1, u2가 이미 존재하면 다시 넣을 수 없음.
  • 복합 기본키는 중복 팔로우 방지와 빠른 고유 식별에 쓰입니다.

 


 

비교 정리

 

구문 기능 중복 가능 검색 속도 특징
@@index([a,b]) 인덱스 생성 가능 빠름 조회 성능 개선용
@@unique([a,b]) 유니크 제약 불가능 빠름 중복 방지 + 자동 인덱스 생성
@@id([a,b]) 복합 기본키 불가능 빠름 모델의 식별자 역할

 

 


 

Prisma 모델 예시 

Like 모델 — 좋아요 (중복 방지 + 빠른 조회)

model Like {
  id        String   @id @default(cuid())
  userId    String
  postId    String
  createdAt DateTime @default(now())

  @@index([userId, postId])
  @@unique([userId, postId])
}
  • 같은 유저가 같은 글에 두 번 좋아요 누르는 걸 차단하면서, 조회도 빠르게.

 

Follows 모델 — 팔로우 관계 (복합키)

model Follows {
  followerId  String
  followingId String
  createdAt   DateTime @default(now())

  @@id([followerId, followingId])
  @@index([followerId, followingId])
}
  • 한 유저가 같은 사람을 중복 팔로우하지 못하게 하며, 조회 속도도 향상.

Notification 모델 — 알림 (조회 최적화)

model Notification {
  id        String @id @default(cuid())
  userId    String
  createdAt DateTime @default(now())
  @@index([userId, createdAt])
}
  • 특정 유저의 알림을 최신순으로 빠르게 조회 가능.

 

'개발 공부' 카테고리의 다른 글

Prisma DB 연결  (0) 2025.11.09
Prisma 관계(Relation)  (0) 2025.11.02
Prisma 스키마 (1)  (0) 2025.10.31
Prop Drilling  (0) 2025.10.24
DFS, BFS  (0) 2025.10.08