BEEP 앱의 데이터베이스는 제2정규화를 적용한 관계형 데이터베이스로, 기프티콘/WiFi/멤버십을 통합 관리합니다.
- 제2정규화 적용: 공통 속성은 메인 테이블에, 타입별 속성은 상세 테이블에 분리
- 타입 통합: 기프티콘, WiFi, 멤버십을 하나의 아이템으로 통합 관리
- 그룹 공유: 사용자 그룹 간 아이템 공유 지원
- Firebase 동기화: 클라우드 동기화를 위한 필드 포함
erDiagram
%% 메인 테이블
items_table {
bigint id PK "Auto increment"
varchar firebase_id "Firebase 동기화용 ID"
varchar type "GIFTICON, WIFI, MEMBERSHIP"
varchar owner_id "소유자 ID"
varchar code "바코드/QR코드 데이터"
varchar code_type "QR_CODE, CODE_128 등"
varchar name "아이템 이름"
datetime created_at "생성일"
datetime updated_at "수정일"
varchar sync_status "SYNCED, PENDING, CONFLICT"
}
%% 사용자 테이블
users_table {
varchar id PK "Firebase User ID"
varchar display_name "표시 이름"
varchar profile_image_url "프로필 이미지 URL"
datetime last_updated "최종 업데이트"
}
%% 기프티콘 상세 테이블
gifticon_details_table {
bigint item_id PK,FK "items_table.id"
varchar brand "브랜드명"
varchar display_brand "표시용 브랜드명"
datetime expire_at "만료일"
boolean is_cash_card "현금권 여부"
int total_cash "총 금액"
int remain_cash "잔액"
boolean is_used "사용 여부"
datetime used_at "사용일"
varchar memo "메모"
}
%% WiFi 상세 테이블
wifi_details_table {
bigint item_id PK,FK "items_table.id"
varchar ssid "네트워크 이름"
varchar password_encrypted "암호화된 비밀번호"
varchar security_type "WPA, WPA2, WEP"
varchar location_name "위치 이름"
}
%% 멤버십 상세 테이블
membership_details_table {
bigint item_id PK,FK "items_table.id"
varchar brand "브랜드명"
varchar membership_number "멤버십 번호"
}
%% 이미지 테이블
item_images_table {
bigint id PK "Auto increment"
bigint item_id FK "items_table.id"
varchar image_type "ORIGINAL, CROPPED, THUMBNAIL"
varchar local_uri "로컬 URI"
varchar firebase_url "Firebase Storage URL"
varchar cropped_rect "크롭 영역 정보"
datetime created_at "생성일"
}
%% 그룹 테이블
groups_table {
varchar id PK "Firebase group ID"
varchar name "그룹 이름"
varchar description "그룹 설명"
varchar invite_code "초대 코드"
varchar created_by "생성자 ID"
int member_count "멤버 수"
datetime joined_at "가입일"
datetime last_sync_at "최종 동기화"
}
%% 그룹-아이템 연결 테이블 (다대다)
group_items_table {
varchar group_id PK,FK "groups_table.id"
bigint item_id PK,FK "items_table.id"
datetime shared_at "공유일"
varchar shared_by "공유한 사용자 ID"
}
%% 사용 기록 테이블
usage_history_table {
bigint id PK "Auto increment"
varchar firebase_id "Firebase 동기화용 ID"
bigint item_id FK "items_table.id"
varchar item_type "GIFTICON, WIFI, MEMBERSHIP"
varchar used_by "사용자 ID"
int amount "사용 금액 (기프티콘만)"
varchar group_id "그룹 ID"
datetime used_at "사용일"
varchar note "메모"
}
%% 동기화 추적 테이블
pending_changes_table {
bigint id PK "Auto increment"
bigint item_id FK "items_table.id"
varchar change_type "CREATED, MODIFIED, DELETED"
datetime timestamp "변경 시각"
}
%% 관계 정의
items_table ||--|| gifticon_details_table : "1:1 (type=GIFTICON)"
items_table ||--|| wifi_details_table : "1:1 (type=WIFI)"
items_table ||--|| membership_details_table : "1:1 (type=MEMBERSHIP)"
items_table ||--o{ item_images_table : "1:N"
items_table ||--o{ usage_history_table : "1:N"
items_table ||--o{ pending_changes_table : "1:N"
users_table ||--o{ items_table : "owner_id"
users_table ||--o{ groups_table : "created_by"
users_table ||--o{ group_items_table : "shared_by"
users_table ||--o{ usage_history_table : "used_by"
groups_table ||--o{ group_items_table : "1:N"
items_table ||--o{ group_items_table : "1:N"
groups_table ||--o{ usage_history_table : "group_id"
모든 타입의 아이템(기프티콘/WiFi/멤버십)이 공통으로 가지는 속성을 저장하는 중심 테이블입니다.
주요 컬럼:
type: 아이템 타입 구분 (GIFTICON, WIFI, MEMBERSHIP)code: 바코드/QR코드 실제 데이터code_type: 코드 형식 (QR_CODE, CODE_128, EAN_13 등)sync_status: Firebase 동기화 상태
사용자 기본 정보를 저장하며, owner_name 대신 JOIN으로 사용자 이름을 조회합니다.
기프티콘 고유의 속성들을 저장합니다.
- 만료일, 현금권 정보, 사용 상태 등
WiFi 접속 정보를 저장합니다.
- SSID, 암호화된 비밀번호, 보안 타입
- QR 형식:
WIFI:S:NetworkName;T:WPA;P:password;;
멤버십 카드 정보를 저장합니다.
- 브랜드명, 멤버십 번호 (최소한의 정보만)
그룹과 아이템 간의 다대다 관계를 관리합니다.
- 하나의 아이템을 여러 그룹에 공유 가능
- 하나의 그룹에 여러 아이템 존재 가능
아이템별로 여러 이미지(원본, 크롭, 썸네일)를 저장할 수 있습니다.
아이템 사용 기록을 저장합니다.
- 누가, 언제, 어떤 아이템을 사용했는지 추적
오프라인에서 변경된 내용을 추적하여 온라인 복구 시 동기화에 활용합니다.
-- 성능 최적화를 위한 권장 인덱스
CREATE INDEX idx_items_type ON items_table(type);
CREATE INDEX idx_items_owner ON items_table(owner_id);
CREATE INDEX idx_items_sync_status ON items_table(sync_status);
CREATE INDEX idx_group_items_group_id ON group_items_table(group_id);
CREATE INDEX idx_usage_history_item_id ON usage_history_table(item_id);
CREATE INDEX idx_usage_history_used_by ON usage_history_table(used_by);-
새로운 아이템 타입 추가
- items_table에 새로운 type 값 추가
- 해당 타입의 상세 정보를 위한 새로운 details_table 생성
-
Firebase 동기화
- firebase_id 필드를 통한 클라우드 연동
- sync_status로 동기화 상태 관리
-
성능 최적화
- 타입별 조회 시 인덱스 활용
- 필요한 정보만 JOIN하여 조회