136 lines
6.3 KiB
Markdown
136 lines
6.3 KiB
Markdown
# 적자 탈출 가계부 - ERD 다이어그램
|
|
|
|
## 엔티티 관계 다이어그램 (ERD)
|
|
|
|
아래는 적자 탈출 가계부 앱의 데이터베이스 구조를 표현한 ERD입니다. 이 다이어그램은 각 테이블 간의 관계와 주요 필드를 보여줍니다.
|
|
|
|
```
|
|
+----------------+ +----------------+ +----------------+
|
|
| Users | | Cards | | Categories |
|
|
+----------------+ +----------------+ +----------------+
|
|
| PK id |<----->| PK id | | PK id |
|
|
| email | | FK user_id | | name |
|
|
| password_hash | | name | | icon |
|
|
| name | | card_type | | color |
|
|
| profile_image | | card_number_4 | | FK parent_id |
|
|
| created_at | | issuer | | is_system |
|
|
| updated_at | | color | | is_active |
|
|
| last_login_at | | payment_day | | created_at |
|
|
| notif_settings | | monthly_limit | | updated_at |
|
|
| theme_pref | | is_active | +----------------+
|
|
| is_active | | created_at | ^
|
|
+----------------+ | updated_at | |
|
|
^ +----------------+ |
|
|
| ^ |
|
|
| | |
|
|
| | |
|
|
| | |
|
|
+----------------+ +----------------+ +----------------+
|
|
| Notifications | | Expenses | | Templates |
|
|
+----------------+ +----------------+ +----------------+
|
|
| PK id | | PK id | | PK id |
|
|
| FK user_id | | FK user_id | | FK user_id |
|
|
| title | | FK card_id | | name |
|
|
| message | | FK category_id | | FK category_id |
|
|
| type | | amount | | amount |
|
|
| entity_type | | merchant | | merchant |
|
|
| entity_id | | transaction_dt | | description |
|
|
| is_read | | description | | is_favorite |
|
|
| created_at | | location | | created_at |
|
|
| read_at | | is_recurring | | updated_at |
|
|
+----------------+ | receipt_image | +----------------+
|
|
| tags |
|
|
| created_at |
|
|
| updated_at |
|
|
+----------------+
|
|
^
|
|
|
|
|
|
|
|
+----------------+
|
|
| Limits |
|
|
+----------------+
|
|
| PK id |
|
|
| FK user_id |
|
|
| FK card_id |
|
|
| FK category_id |
|
|
| amount |
|
|
| period |
|
|
| start_date |
|
|
| end_date |
|
|
| is_active |
|
|
| created_at |
|
|
| updated_at |
|
|
+----------------+
|
|
```
|
|
|
|
## 관계 설명
|
|
|
|
1. **Users (사용자)**
|
|
- 사용자는 여러 개의 카드를 가질 수 있음 (1:N)
|
|
- 사용자는 여러 개의 지출 내역을 가질 수 있음 (1:N)
|
|
- 사용자는 여러 개의 한도를 설정할 수 있음 (1:N)
|
|
- 사용자는 여러 개의 알림을 받을 수 있음 (1:N)
|
|
- 사용자는 여러 개의 템플릿을 생성할 수 있음 (1:N)
|
|
|
|
2. **Cards (카드)**
|
|
- 카드는 한 명의 사용자에게 속함 (N:1)
|
|
- 카드는 여러 개의 지출 내역과 연결됨 (1:N)
|
|
- 카드는 여러 개의 한도 설정과 연결될 수 있음 (1:N)
|
|
|
|
3. **Categories (카테고리)**
|
|
- 카테고리는 여러 개의 지출 내역과 연결됨 (1:N)
|
|
- 카테고리는 여러 개의 한도 설정과 연결될 수 있음 (1:N)
|
|
- 카테고리는 여러 개의 템플릿과 연결될 수 있음 (1:N)
|
|
- 카테고리는 자기 참조 관계를 가짐 (부모-자식 계층 구조)
|
|
|
|
4. **Expenses (지출)**
|
|
- 지출은 한 명의 사용자에게 속함 (N:1)
|
|
- 지출은 하나의 카드와 연결됨 (N:1)
|
|
- 지출은 하나의 카테고리와 연결됨 (N:1)
|
|
|
|
5. **Limits (한도)**
|
|
- 한도는 한 명의 사용자에게 속함 (N:1)
|
|
- 한도는 선택적으로 하나의 카드와 연결될 수 있음 (N:1)
|
|
- 한도는 선택적으로 하나의 카테고리와 연결될 수 있음 (N:1)
|
|
|
|
6. **Notifications (알림)**
|
|
- 알림은 한 명의 사용자에게 속함 (N:1)
|
|
- 알림은 선택적으로 다른 엔티티(카드, 지출 등)와 연결될 수 있음
|
|
|
|
7. **Templates (템플릿)**
|
|
- 템플릿은 한 명의 사용자에게 속함 (N:1)
|
|
- 템플릿은 하나의 카테고리와 연결됨 (N:1)
|
|
|
|
## 주요 제약 조건
|
|
|
|
1. **외래 키 제약 조건**
|
|
- 모든 외래 키는 참조 무결성을 유지해야 함
|
|
- 사용자가 삭제되면 해당 사용자의 모든 관련 데이터도 삭제됨 (CASCADE)
|
|
- 카테고리가 삭제되면 관련 지출은 '기타' 카테고리로 이동 (SET DEFAULT)
|
|
|
|
2. **유일성 제약 조건**
|
|
- 사용자 이메일은 유일해야 함
|
|
- 카테고리 이름은 같은 부모 내에서 유일해야 함
|
|
|
|
3. **필수 필드**
|
|
- 지출에는 반드시 금액, 날짜, 카테고리가 있어야 함
|
|
- 한도에는 반드시 금액, 기간, 시작일이 있어야 함
|
|
|
|
## 인덱스 전략
|
|
|
|
성능 최적화를 위해 다음과 같은 인덱스가 생성됩니다:
|
|
|
|
1. **검색 최적화**
|
|
- expenses(user_id, transaction_date): 날짜별 지출 검색 최적화
|
|
- expenses(user_id, category_id): 카테고리별 지출 검색 최적화
|
|
- expenses(user_id, card_id): 카드별 지출 검색 최적화
|
|
|
|
2. **정렬 최적화**
|
|
- expenses(amount): 금액별 정렬 최적화
|
|
- notifications(created_at): 알림 시간순 정렬 최적화
|
|
|
|
3. **필터링 최적화**
|
|
- cards(is_active): 활성 카드 필터링
|
|
- limits(is_active): 활성 한도 필터링
|
|
- notifications(is_read): 읽지 않은 알림 필터링
|