Files
Obsidian/ZELLYY/zellyy note/02_기술_문서/ERD_다이어그램.md
2025-03-26 18:16:46 +09:00

245 lines
8.9 KiB
Markdown

# ERD 다이어그램
이 문서는 Zellyy 프로젝트의 데이터베이스 구조를 Entity-Relationship Diagram(ERD)으로 설명합니다.
## 개요
Zellyy 프로젝트는 사용자가 카드를 작성하고 관리하며 소셜 미디어에 공유하는 기능을 제공합니다. 이를 위한 데이터베이스 구조는 다음과 같은 주요 엔티티로 구성됩니다:
1. 사용자 (Users)
2. 카드 (Cards)
3. 카드 태그 (Card Tags)
4. 소셜 계정 (Social Accounts)
5. 소셜 공유 (Social Shares)
6. 구독 (Subscriptions)
## ERD 다이어그램
아래는 Zellyy 프로젝트의 ERD 다이어그램입니다. 이 다이어그램은 [dbdiagram.io](https://dbdiagram.io)를 사용하여 생성되었습니다.
```
// Zellyy 데이터베이스 ERD
// 이 다이어그램은 dbdiagram.io에서 생성되었습니다.
Table zellyy.users {
id UUID [pk, ref: > auth.users.id]
email TEXT [not null, unique]
username TEXT [unique]
display_name TEXT
avatar_url TEXT
created_at TIMESTAMP [default: `NOW()`]
updated_at TIMESTAMP [default: `NOW()`]
last_login TIMESTAMP
is_premium BOOLEAN [default: false]
premium_until TIMESTAMP
}
Table zellyy.cards {
id UUID [pk, default: `uuid_generate_v4()`]
user_id UUID [not null, ref: > zellyy.users.id]
content TEXT [not null]
background_color TEXT [default: '#FFFFFF']
text_color TEXT [default: '#000000']
font_family TEXT [default: 'system']
font_size INTEGER [default: 16]
text_align TEXT [default: 'center']
is_public BOOLEAN [default: false]
is_synced BOOLEAN [default: false]
created_at TIMESTAMP [default: `NOW()`]
updated_at TIMESTAMP [default: `NOW()`]
deleted_at TIMESTAMP
}
Table zellyy.card_tags {
id UUID [pk, default: `uuid_generate_v4()`]
card_id UUID [not null, ref: > zellyy.cards.id]
tag_name TEXT [not null]
created_at TIMESTAMP [default: `NOW()`]
indexes {
(card_id, tag_name) [unique]
}
}
Table zellyy.social_accounts {
id UUID [pk, default: `uuid_generate_v4()`]
user_id UUID [not null, ref: > zellyy.users.id]
platform TEXT [not null]
platform_user_id TEXT
access_token TEXT
refresh_token TEXT
token_expires_at TIMESTAMP
created_at TIMESTAMP [default: `NOW()`]
updated_at TIMESTAMP [default: `NOW()`]
indexes {
(user_id, platform) [unique]
}
}
Table zellyy.social_shares {
id UUID [pk, default: `uuid_generate_v4()`]
card_id UUID [not null, ref: > zellyy.cards.id]
user_id UUID [not null, ref: > zellyy.users.id]
platform TEXT [not null]
share_url TEXT
shared_at TIMESTAMP [default: `NOW()`]
status TEXT [default: 'pending']
response_data JSONB
}
Table zellyy.subscriptions {
id UUID [pk, default: `uuid_generate_v4()`]
user_id UUID [not null, ref: > zellyy.users.id]
plan_type TEXT [not null]
status TEXT [not null]
start_date TIMESTAMP [not null]
end_date TIMESTAMP [not null]
payment_provider TEXT
payment_id TEXT
created_at TIMESTAMP [default: `NOW()`]
updated_at TIMESTAMP [default: `NOW()`]
}
// 참조 테이블 (Supabase Auth)
Table auth.users {
id UUID [pk]
email TEXT [unique]
// 기타 Supabase Auth 필드
}
```
## 엔티티 설명
### 1. 사용자 (zellyy.users)
사용자 정보를 저장하는 테이블입니다. Supabase Auth와 연동됩니다.
- **id**: 사용자 고유 식별자 (UUID), Supabase Auth의 사용자 ID와 연결
- **email**: 사용자 이메일 주소
- **username**: 사용자 이름 (고유)
- **display_name**: 표시 이름
- **avatar_url**: 프로필 이미지 URL
- **created_at**: 계정 생성 시간
- **updated_at**: 계정 정보 업데이트 시간
- **last_login**: 마지막 로그인 시간
- **is_premium**: 프리미엄 사용자 여부
- **premium_until**: 프리미엄 구독 만료 시간
### 2. 카드 (zellyy.cards)
사용자가 작성한 카드 정보를 저장하는 테이블입니다.
- **id**: 카드 고유 식별자 (UUID)
- **user_id**: 카드 작성자 ID (users 테이블 참조)
- **content**: 카드 내용
- **background_color**: 배경색 (HEX 코드)
- **text_color**: 텍스트 색상 (HEX 코드)
- **font_family**: 폰트 패밀리
- **font_size**: 폰트 크기
- **text_align**: 텍스트 정렬 방식 ('left', 'center', 'right')
- **is_public**: 공개 여부
- **is_synced**: 클라우드 동기화 여부
- **created_at**: 카드 생성 시간
- **updated_at**: 카드 업데이트 시간
- **deleted_at**: 카드 삭제 시간 (소프트 삭제)
### 3. 카드 태그 (zellyy.card_tags)
카드에 적용된 태그 정보를 저장하는 테이블입니다.
- **id**: 태그 고유 식별자 (UUID)
- **card_id**: 카드 ID (cards 테이블 참조)
- **tag_name**: 태그 이름
- **created_at**: 태그 생성 시간
### 4. 소셜 계정 (zellyy.social_accounts)
사용자의 소셜 미디어 계정 연동 정보를 저장하는 테이블입니다.
- **id**: 소셜 계정 고유 식별자 (UUID)
- **user_id**: 사용자 ID (users 테이블 참조)
- **platform**: 플랫폼 이름 ('facebook', 'twitter', 'instagram' 등)
- **platform_user_id**: 플랫폼에서의 사용자 ID
- **access_token**: 액세스 토큰
- **refresh_token**: 리프레시 토큰
- **token_expires_at**: 토큰 만료 시간
- **created_at**: 연동 생성 시간
- **updated_at**: 연동 업데이트 시간
### 5. 소셜 공유 (zellyy.social_shares)
카드의 소셜 미디어 공유 기록을 저장하는 테이블입니다.
- **id**: 공유 기록 고유 식별자 (UUID)
- **card_id**: 카드 ID (cards 테이블 참조)
- **user_id**: 사용자 ID (users 테이블 참조)
- **platform**: 공유된 플랫폼 이름
- **share_url**: 공유된 URL
- **shared_at**: 공유 시간
- **status**: 공유 상태 ('pending', 'success', 'failed')
- **response_data**: 플랫폼 응답 데이터 (JSON)
### 6. 구독 (zellyy.subscriptions)
사용자의 구독 정보를 저장하는 테이블입니다.
- **id**: 구독 고유 식별자 (UUID)
- **user_id**: 사용자 ID (users 테이블 참조)
- **plan_type**: 구독 플랜 유형 ('monthly', 'yearly' 등)
- **status**: 구독 상태 ('active', 'canceled', 'expired')
- **start_date**: 구독 시작 날짜
- **end_date**: 구독 종료 날짜
- **payment_provider**: 결제 제공자 ('apple', 'google', 'stripe' 등)
- **payment_id**: 결제 ID
- **created_at**: 구독 생성 시간
- **updated_at**: 구독 업데이트 시간
## 관계 설명
1. **사용자와 카드**: 일대다 관계. 한 사용자는 여러 카드를 가질 수 있습니다.
2. **카드와 태그**: 일대다 관계. 한 카드는 여러 태그를 가질 수 있습니다.
3. **사용자와 소셜 계정**: 일대다 관계. 한 사용자는 여러 소셜 계정을 연동할 수 있습니다.
4. **카드와 소셜 공유**: 일대다 관계. 한 카드는 여러 소셜 미디어에 공유될 수 있습니다.
5. **사용자와 구독**: 일대다 관계. 한 사용자는 여러 구독 기록을 가질 수 있습니다.
## 인덱스
성능 최적화를 위해 다음과 같은 인덱스를 생성합니다:
1. **zellyy.cards**:
- `user_id`: 사용자별 카드 조회 최적화
- `created_at`: 시간순 정렬 최적화
- `is_public`: 공개 카드 필터링 최적화
2. **zellyy.card_tags**:
- `(card_id, tag_name)`: 고유 제약 조건 및 카드별 태그 조회 최적화
- `tag_name`: 태그별 카드 검색 최적화
3. **zellyy.social_accounts**:
- `(user_id, platform)`: 고유 제약 조건 및 사용자별 플랫폼 계정 조회 최적화
4. **zellyy.social_shares**:
- `user_id`: 사용자별 공유 기록 조회 최적화
- `card_id`: 카드별 공유 기록 조회 최적화
## 데이터 무결성
데이터 무결성을 보장하기 위해 다음과 같은 제약 조건을 적용합니다:
1. **외래 키 제약 조건**: 모든 관계는 외래 키로 연결되어 참조 무결성을 보장합니다.
2. **고유 제약 조건**: 이메일, 사용자 이름 등은 고유해야 합니다.
3. **NOT NULL 제약 조건**: 필수 필드는 NULL이 될 수 없습니다.
4. **기본값**: 많은 필드에 기본값을 제공하여 데이터 일관성을 유지합니다.
## 확장성 고려사항
1. **샤딩**: 사용자 수가 크게 증가할 경우, 사용자 ID를 기준으로 데이터를 샤딩하는 전략을 고려할 수 있습니다.
2. **아카이빙**: 오래된 카드 데이터는 별도의 아카이브 테이블로 이동하여 주 테이블의 성능을 유지할 수 있습니다.
3. **인덱스 최적화**: 실제 쿼리 패턴에 따라 추가 인덱스를 생성하거나 기존 인덱스를 조정할 수 있습니다.
## 결론
이 ERD는 Zellyy 프로젝트의 데이터 모델을 시각적으로 표현합니다. 이 구조는 사용자가 카드를 작성하고, 태그를 지정하며, 소셜 미디어에 공유하는 핵심 기능을 지원합니다. 또한 구독 관리와 소셜 계정 연동을 위한 테이블도 포함되어 있습니다.
프로젝트가 발전함에 따라 이 ERD는 새로운 요구사항을 반영하여 업데이트될 수 있습니다.