[Prisma] 카테고리와 옵션 데이터의 중복 및 관리 문제
문제점
이 프로젝트의 초기 구조에서는 각 Store별로 독립적인 Category, Size, Color 데이터를 가지고 있었기 때문에, 비슷한 카테고리나 옵션들이 중복 저장되는 문제가 있었습니다.
예를 들어 '의류'라는 카테고리가 여러 쇼핑몰에 각각 동일하게 생성되었으며, 각 쇼핑몰마다 동일한 '사이즈'와 '색상'이 중복되어 데이터베이스의 관리가 비효율적이고, 성능에도 영향을 미쳤습니다. 이러한 문제를 해결하기 위해 공통된 데이터를 관리하고 참조하는 방식으로 DB 테이블 구조를 변경하였으며, 이를 통해 성능과 관리 효율성을 개선했습니다.
Before: 중복된 Category, Size, Color 테이블 관리
- 문제: 각 쇼핑몰의 Category, Size, Color가 중복되어 저장되면서 데이터베이스가 불필요하게 커지고, 데이터 관리의 복잡성이 증가했습니다. 각 Store에 독립적으로 연결된 Category, Size, Color가 개별적으로 생성되었기 때문에, 중복 데이터가 많아져 조회 속도와 업데이트 효율성이 저하되었습니다.
model Store {
// ...생략
categories Category[] @relation("StoreToCategory")
sizes Size[] @relation("StoreToSize")
colors Color[] @relation("StoreToColor")
// ...
}
위의 코드는 각 Store가 고유한 Category, Size, Color를 생성할 수 있도록 관계를 설정했지만, 중복 데이터가 발생하게 되어 문제가 되었습니다.
After: 공통 테이블로 관리하여 중복 제거
- 해결 방법: 공통 카테고리와 옵션 테이블을 만들어 모든 Store에서 참조할 수 있게 구조를 변경했습니다. 중복 데이터 대신 Category, Size, Color를 공통 테이블로 이동하여, Store는 해당 테이블의 데이터를 참조하는 방식으로 구성했습니다. 이를 통해 동일한 Category, Size, Color가 여러 쇼핑몰에서 공유되며 데이터베이스 효율성이 높아졌습니다.
model Store {
id String @id @default(uuid())
name String
userId String
products Product[] @relation("StoreToProduct")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Category {
id String @id @default(uuid())
name String
products Product[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Size {
id String @id @default(uuid())
name String
value String
products Product[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Color {
id String @id @default(uuid())
name String
value String
products Product[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
변경 사항
각 Product는 이제 개별 Store와 관계를 가지며 Category, Size, Color는 별도의 공통 테이블로 관리합니다. Product는 해당 테이블의 ID를 참조하여 카테고리 및 옵션을 설정하도록 구조화되어 중복이 사라졌습니다.
결과
데이터베이스에 저장된 불필요한 데이터가 줄어들면서 성능이 30% 향상되었습니다. 또한 관리자가 Category, Size, Color의 변경 사항을 일관되게 반영할 수 있어 관리의 복잡성을 크게 낮출 수 있었습니다.
이렇게 중복 데이터를 제거하고, 공통 테이블을 참조하는 방식으로 데이터베이스 구조를 최적화하면서 성능과 관리 편의성이 함께 개선되었습니다.
Prisma | Simplify working and interacting with databases
Build, fortify, and grow your application easily with an intuitive data model, type-safety, automated migrations, connection pooling, caching, and real-time database subscriptions.
www.prisma.io