Files
zellyy-finance/docs/02_기술_문서/ERD_다이어그램.md
2025-03-21 16:08:43 +09:00

6.3 KiB

적자 탈출 가계부 - 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): 읽지 않은 알림 필터링