728x90

Prisma + NestJS :: 쇼핑몰 데이터베이스 모델링 및 관계 분석

 

 

안녕하세요! 이번 포스트에서는 ShoppingMall 서비스의 Prisma 데이터베이스 스키마를 다루며, 각 테이블 간의 관계와 그에 따른 중요한 제약조건을 살펴볼 예정입니다. 데이터베이스의 설계는 서비스의 핵심적인 기능과 성능에 큰 영향을 미치므로, 잘 이해하고 설계하는 것이 중요합니다.

 

1. 주요 테이블 및 관계

1.1. User

User 테이블은 서비스의 사용자에 관한 정보를 담당합니다. 각 사용자는 여러 주문을 가질 수 있으며, 일부 사용자는 가게(Store) 정보와 일대일 관계를 형성합니다.

 

model User {

  id          Int    @id @default(autoincrement())

  storeId     Int?   @unique

  ...

  Store       Store?

  ordersAsSeller Order[]

  ordersAsBuyer  Order[]

  ...

}

1.2. Store

Store 테이블은 개별 가게 정보를 담당합니다. 가게는 한 명의 사용자에게 속하며, 여러 상품(Product)을 소유할 수 있습니다.

 

model Store {

  id       Int      @id @default(autoincrement())

  userId   Int      @unique

  ...

  user     User     @relation(fields: [userId], references: [id])

  product  Product[]

  ...

}

1.3. Product

Product 테이블은 상품에 관한 정보를 담당합니다. 각 상품은 한 개의 가게에 속하며, 여러 주문(Order)에 연결될 수 있습니다.

model Product {

  id       Int     @id @default(autoincrement())

  storeId  Int

  ...

  store    Store   @relation(fields: [storeId], references: [id])

  Order    Order[]

  ...

}

1.4. Order

Order 테이블은 주문 정보를 관리합니다. 주문은 한 명의 판매자와 한 명의 구매자, 그리고 한 개의 상품과 다대다 관계를 형성합니다.

 

model Order {

  id          Int    @id @default(autoincrement())

  userSellerId Int

  userBuyerId  Int

  productId    Int?

  ...

  seller      User   @relation("OrderToSeller", fields: [userSellerId], references: [id])

  buyer       User   @relation("OrderToBuyer", fields: [userBuyerId], references: [id])

  product     Product? @relation(fields: [productId], references: [id])

  ...

}

 

 

2. 데이터베이스 관계와 그 의미

2.1. 일대일 관계 (1:1)

User와 Store 사이의 관계는 일대일입니다. 한 사용자는 하나의 가게만을 소유할 수 있으며, 그 반대도 성립합니다.

 

2.2. 일대다 관계 (1:N)

Store와 Product 사이에는 일대다 관계가 있습니다. 한 가게는 여러 상품을 소유할 수 있지만, 각 상품은 하나의 가게에만 속합니다.

 

2.3. 다대다 관계 (N:N)

User와 Order 사이에는 다대다 관계가 있습니다. 여기서 사용자는 여러 주문을 할 수 있으며, 각 주문은 한 명의 판매자와 한 명의 구매자를 갖게 됩니다.

 

3. User와 Order의 다대다 관계 이해하기

우선, 기본적으로 한 사용자는 여러 주문을 생성할 수 있습니다. 예를 들면, 온라인 쇼핑몰에서 쇼핑을 할 때마다 새로운 주문이 생성되는 것과 같습니다. 따라서 User와 Order 사이에는 일대다 관계가 성립합니다.

 

그렇다면 왜 다대다 관계라고 표현했을까요? Order의 관점에서 보면, 하나의 주문은 한 명의 구매자와 한 명의 판매자를 갖습니다. 즉, 두 명의 사용자가 관련되어 있습니다. 이를 표현하기 위해 Order는 두 개의 사용자 ID를 참조합니다: userBuyerId와 userSellerId. 이 두 관계 모두 일대다 관계이지만, 각각의 관계가 Order를 중심으로 User 테이블을 두 번 참조하므로, 전반적으로 다대다의 관계 특성을 갖게 됩니다.

 

3.1. 예시로 이해하기

User A는 판매자로서 여러 상품을 판매하고 있습니다.

User B는 A의 상품 중 하나를 구매하려고 주문을 생성합니다.

이 주문은 A를 판매자로, B를 구매자로 갖게 됩니다.

Order 테이블에 새로운 레코드가 생성되며, userSellerId는 A의 ID를, userBuyerId는 B의 ID를 참조하게 됩니다.

예시에서 있듯이, 하나의 주문은 명의 사용자와 관련되어 있습니다. 이렇게 서로 다른 역할(구매자와 판매자) 같은 테이블(User) 여러 참조하는 것을 다대다 관계라고 있습니다.

 

3.2. 결론


User와 Order 사이의 관계는 사용자의 역할(구매자 또는 판매자)에 따라 일대다 관계가 두 번 성립하므로, 전체적으로는 다대다 관계의 특성을 갖습니다. 이러한 복잡한 관계는 데이터베이스 설계 시 정확한 이해와 적절한 구조로 표현해야 합니다.

 

4. 다대다 관계 이해하기 (학생과 수업의 관계)

 

다대다 관계는 많은 데이터베이스 설계 상황에서 흔히 나타납니다. 학교나 대학교의 수업과 학생 관계를 예로 들어보겠습니다.


4.1. 시나리오

대학교에서 학생들은 여러 수업을 수강할 수 있습니다. 반대로 한 수업은 여러 학생들에게 강의될 수 있습니다.

  • 학생 테이블 (Student): 각 학생은 고유의 학번, 이름 등의 정보를 가집니다.
  • 수업 테이블 (Class): 각 수업은 고유의 코드, 수업 이름, 강사 정보 등을 가집니다. 

이렇게 단순하게 두 테이블로 구성된다면 학생과 수업 사이는 다대다 관계를 형성합니다. 학생 A는 수업 X, Y, Z를 수강할 수 있고, 수업 X는 학생 A, B, C에게 강의될 수 있기 때문입니다.

다대다 관계를 표현하는 방법

대부분의 RDBMS는 다대다 관계를 직접 표현할 수 없기 때문에, 중간에 연결 테이블 (junction table 또는 bridge table)이 필요합니다.

4.2. 수강 테이블 (Enrollment, 학생과 수업 연결)

학생과 수업의 관계를 나타내기 위한 테이블입니다. 이 테이블에는 studentId와 classId라는 두 개의 외래 키가 포함됩니다. 각 레코드는 특정 학생이 특정 수업을 수강한다는 것을 나타냅니다.
이렇게 Enrollment 테이블을 통해 학생과 수업 사이의 다대다 관계가 명확하게 표현됩니다.

4.3. 결론

다대다 관계는 두 엔터티 간에 양방향의 1:N 관계가 성립할 때 발생합니다. 이 관계를 RDBMS에서 효율적으로 표현하려면 연결 테이블이 필요합니다. 이 연결 테이블은 두 엔터티 간의 연관성을 저장하며, 실제 응용 프로그램에서는 다양한 쿼리나 조인 연산을 통해 데이터를 검색하게 됩니다.

 

5. 테이블의 주요 제약조건


5.1. Unique 제약조건


User 테이블의 email과 phoneNumber는 서비스 내에서 중복될 수 없으므로 @unique 제약조건이 설정되어 있습니다. 이는 사용자의 고유한 식별 정보로 사용되기 때문입니다.



5.2. Optional vs Required


Prisma 스키마에서 ?는 해당 필드가 선택적(optional)임을 나타냅니다. 예를 들어, User의 storeId는 ?가 붙어있어, 모든 사용자가 가게 정보를 갖지 않아도 됩니다.

 

6. 종합 및 제약 조건의 중요성

데이터베이스의 관계 설정은 데이터의 일관성과 무결성을 유지하기 위한 핵심 요소입니다. 잘못된 관계나 제약 조건 설정은 추후 데이터 충돌이나 중복 등의 문제를 일으킬 수 있습니다.

 

이외에도 외래 (Foreign Key) 제약조건, 기본 (Primary Key) 설정 다양한 제약조건이 중요한 역할을 합니다. 이들은 데이터베이스의 안정성과 성능을 보장하기 위해 필요한 요소들입니다.

 

7. 마무리

이 포스트를 통해 ShoppingMall 서비스의 Prisma 데이터베이스 스키마 및 테이블 간의 관계를 살펴보았습니다. 일대일, 일대다, 다대다 등의 관계를 이해하는 것은 데이터베이스 설계와 쿼리 작성에 있어 중요한 요소입니다.

 

데이터베이스 모델링은 애플리케이션의 기반이 되므로 정확한 이해가 필요합니다. 질문이나 피드백이 있으시면 언제든지 댓글로 남겨주세요!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts