← KARE Prototype

KARE — 구현 ERD / 엔티티

실행 중 데이터베이스 스키마 + DB 테이블 코멘트 기준 (설계 산출물 아님). 다이어그램: vis-network.
● source: 실행 중 kare_postgres · public schema · 생성 2026-05-16 10:42:13 UTC
57
Tables
729
Columns
79
Foreign Keys
55/57
테이블 코멘트
410
컬럼 코멘트

ERD — 테이블(노드) · FK(엣지) · BC 그룹 색상

BC-1BC-10BC-11BC-12BC-2BC-3BC-4BC-5BC-6BC-7BC-8BC-9SYS기타
노드 hover = 한글 코멘트 툴팁 · 드래그/줌 가능 · 더블클릭 시 해당 카드로 이동
57 tables

addon_permission_rules

BC-29 cols

BC-2 Product / DM-PRD-004 / ENT-010: Add-on 허용 3-Tier 규칙 (BD-016).

target_partner_id → partners.idtarget_item_product_id → item_products.idintegrated_product_id → integrated_products.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
integrated_product_idFK→integrated_products
대상 통합 상품 (FK integrated_products, ON DELETE CASCADE).
uuidNOT NULL
scope
AddonPermissionScope(PRODUCT/PARTNER/CATEGORY/DENY). 평가 우선순위는 응용 레이어가 priorityOrder() 로 정렬.
varchar(20)NOT NULL
action
AddonPermissionAction(ALLOW/DENY).
varchar(20)NOT NULL
target_item_product_idFK→item_products
PRODUCT scope 의 대상 (FK item_products).
uuidNULL
target_partner_idFK→partners
PARTNER scope 의 대상 (FK partners).
uuidNULL
target_category
CATEGORY scope 의 대상 (PartnerCategory enum 문자열).
varchar(20)NULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

admins

BC-111 cols

BC-1 Identity / DM-ID-006: KARE 내부 관리자 계정 (Google Workspace SSO 전용, BD-024).

ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
email
Google Workspace 이메일 (UNIQUE).
varchar(255)NOT NULL
google_sub
Google Workspace SSO sub 클레임. NULL 이면 SSO 로그인 비활성 (password-only). V082 (2026-05) 에서 NULLABLE 로 완화 — BL-21 폴백 인프라.
varchar(255)NULL
name
관리자 표시 이름.
varchar(100)NOT NULL
status
AdminStatus(ACTIVE/INACTIVE) — INACTIVE 는 로그인 차단.
varchar(20)NOT NULL'ACTIVE'::character varying
last_login_at
마지막 SSO 로그인 일시 (감사·휴면 분석용).
timestamptzNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()
token_version
BR-AUTH-010 — Refresh Token 무효화 카운터. JWT tv 클레임과 일치해야 통과. 로그아웃·강제 로그아웃·정지 시 +=1.
intNOT NULL0
password_hash
BCrypt 해시 ($2a$12$… 60자). NULL 이면 password 로그인 비활성 (SSO-only). BL-21 — Admin 이메일/비밀번호 폴백 로그인 (2026-05).
varchar(60)NULL
lock_until
BR-AUTH-006 — 로그인 5회 연속 실패 잠금 만료 시각. NULL 이면 미잠금.
timestamptzNULL

audit_log_export_jobs

기타12 cols

API-AUD-003 비동기 CSV export Job 메타. 24h presigned URL + AUD-030 자체 감사 연계.

ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
actor_admin_iduuidNOT NULL
filter_snapshot
요청 필터 + 컬럼 화이트리스트 (PHR sanitize 통과 후 적재).
jsonbNOT NULL'{}'::jsonb
estimated_rows
enqueue 시점 추정 행 수. 100,000 초과 시 AUDIT_EXPORT_TOO_LARGE (413) 거부.
bigintNOT NULL
status
QUEUED → RUNNING → SUCCEEDED | FAILED.
varchar(20)NOT NULL'QUEUED'::character varying
actor_ipinetNULL
user_agentvarchar(500)NULL
created_attimestamptzNOT NULLnow()
completed_attimestamptzNULL
download_url
Worker 가 발급한 24h presigned URL (Azure Blob SAS 등).
varchar(2000)NULL
download_expires_attimestamptzNULL
error_code
FAILED 시 사유 코드 (예: AUDIT_EXPORT_FAILED).
varchar(80)NULL

audit_logs

기타14 cols

— DB 코멘트 없음 —

ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
audit_codevarchar(50)NOT NULL
bc_codevarchar(10)NOT NULL
severityvarchar(20)NOT NULL
actor_typevarchar(20)NOT NULL
actor_iduuidNULL
actor_ipinetNULL
user_agentvarchar(500)NULL
target_typevarchar(50)NULL
target_iduuidNULL
payloadjsonbNOT NULL'{}'::jsonb
occurred_atPKtimestamptzNOT NULLnow()
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

auth_sessions

SYS15 cols

SYS / DM-SYS-005: Refresh Token 영속 세션 SSoT. 평문 미저장 — refresh_token_hash 는 SHA-256 hex(64). BR-AUTH-010 / AUTH-KARE §8.4.1.

ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
subject_type
USER / PARTNER_ACCOUNT / ADMIN — 인증 주체 유형.
varchar(20)NOT NULL
subject_id
users.id / partner_accounts.id / admins.id — actor 폴리모픽 참조 (FK 없음).
uuidNOT NULL
refresh_token_hash
SHA-256 hex(64). 평문 Refresh Token 절대 저장 금지 — §2.2.18 비고.
varchar(64)NOT NULL
device_label
디바이스 표시명 (감사용, 사용자 노출 가능).
varchar(200)NULL
ip_addressinetNULL
user_agentvarchar(500)NULL
status
AuthSessionStatus(ACTIVE/REVOKED/EXPIRED). 회전 시 기존 행은 REVOKED + revoke_reason=ROTATED.
varchar(20)NOT NULL'ACTIVE'::character varying
issued_attimestamptzNOT NULLnow()
last_used_attimestamptzNOT NULLnow()
expires_at
Refresh Token TTL 만료 시각. 배치가 ACTIVE & expires_at < NOW() 행을 EXPIRED 로 전환.
timestamptzNOT NULL
revoked_attimestamptzNULL
revoke_reason
LOGOUT / ROTATED / PASSWORD_RESET / ACCOUNT_SUSPENDED / ADMIN_FORCE — REVOKED 시 사유 코드.
varchar(100)NULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

bookings

BC-615 cols

BC-6 Service / DM-SVC-002: 파트너별 묶음 예약 (BD-029 IV × Partner = 1).

partner_id → partners.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
integrated_voucher_id
소속 Integrated Voucher (FK 는 BC-4 마이그레이션에서 강제).
uuidNOT NULL
partner_idFK→partners
예약 대상 파트너사 (FK partners(id), ON DELETE RESTRICT).
uuidNOT NULL
category
BookingCategory(MEDICAL/AESTHETIC/MOBILITY/ACCOMMODATION).
varchar(20)NOT NULL
headcount
인원수 (BD-029 묶음 헤드카운트).
intNOT NULL1
status
BookingStatus REQUESTED→CONFIRMED|REJECTED→IN_MEDIATION→COMPLETED|CANCELLED.
varchar(20)NOT NULL'REQUESTED'::character varying
scheduled_at
예정 시각 (UTC).
timestamptzNULL
location_metadata
픽업/체크인 좌표·주소 등 비PHR 메타 (BD-003).
jsonbNULL
rejection_reason
거절 사유 (REJECTED 전환 시 채워짐).
varchar(500)NULL
confirmed_attimestamptzNULL
rejected_attimestamptzNULL
completed_attimestamptzNULL
cancelled_attimestamptzNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

cart_items

BC-312 cols

BC-3 Order / DM-ORD-006: 장바구니 라인 (BD-003 PHR 비취급 — product_snapshot 화이트리스트만 보존).

cart_id → carts.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
cart_idFK→cartsuuidNOT NULL
integrated_product_iduuidNOT NULL
product_snapshot
IntegratedProduct 스냅샷 (name·category·partnerId·priceUsd·usagePeriodHours). PHR 컬럼 일절 포함 금지.
jsonbNOT NULL
quantityintNOT NULL
addon_item_product_idsjsonbNOT NULL'{"ids": []}'::jsonb
member_optionjsonbNULL
unit_price_usdnumeric(12,2)NOT NULL
addon_total_usdnumeric(12,2)NOT NULL0
line_total_usd
(unit_price_usd + addon_total_usd) * quantity 계산 결과의 정합 보존.
numeric(12,2)NOT NULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

carts

BC-34 cols

BC-3 Order / DM-ORD-005: 장바구니 헤더. 사용자 1인당 1행 (uq_carts_user).

user_id → users.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
user_idFK→users
소유 사용자 (FK users.id, RLS-USR 격리 컬럼).
uuidNOT NULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

channel_codes

BC-711 cols

BC-7 Channel / DM-CHN-003 / ENT-046: PASS 등록 코드 (BD-022 PREFIX-XXXX-XXXX).

channel_contract_id → channel_contracts.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
channel_contract_idFK→channel_contractsuuidNOT NULL
code
BD-022 형식 PREFIX-XXXX-XXXX (UNIQUE).
varchar(30)NOT NULL
integrated_voucher_id
발행된 PASS 연결 — FK 강제는 BC-4 voucher 테이블 도입 후 별도 ALTER.
uuidNULL
redeemed_by_user_iduuidNULL
status
ChannelCodeStatus(AVAILABLE/REGISTERED/EXPIRED/REVOKED). REVOKED 는 BD-030 부분취소·해지에서 사용.
varchar(20)NOT NULL'AVAILABLE'::character varying
reserved_attimestamptzNULL
redeemed_attimestamptzNULL
valid_untiltimestamptzNOT NULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

channel_contract_changes

BC-710 cols

BC-7 Channel / DM-CHN-004 / ENT-047: 계약 변경 이력 (BD-030 append-only).

channel_contract_id → channel_contracts.idadmin_id → admins.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
channel_contract_idFK→channel_contractsuuidNOT NULL
change_type
ChannelContractChangeType(PARTIAL_CANCEL/ADDITIONAL_ISSUE/TERMINATE).
varchar(30)NOT NULL
quantity_delta
증감 수량 (음수=취소/해지, 양수=추가발행).
intNOT NULL
reasonvarchar(500)NULL
admin_idFK→adminsuuidNOT NULL
snapshot
변경 전·후 스냅샷 JSONB (계약 상태, 코드 식별자, 환불액 등). PHR 키 저장 금지 (BD-003).
jsonbNOT NULL'{}'::jsonb
occurred_attimestamptzNOT NULLnow()
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

channel_contracts

BC-710 cols

BC-7 Channel / DM-CHN-001 / ENT-023: B2B 채널사 단체 구매 계약 헤더.

created_by_admin_id → admins.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
channel_company_name
채널사명 (BD-020 — 시스템 외부 액터).
varchar(200)NOT NULL
integrated_product_id
대상 통합 상품 ID. FK 강제는 BC-2 product 테이블 도입 후 별도 ALTER.
uuidNOT NULL
contract_quantity
계약 수량 (>=1, BD-030 추가 발행/부분 취소 시 증감).
intNOT NULL
validity_period_hours
PASS 유효 기간(시간) — 사용 시작 후 만료까지의 길이 (BR-VCH-EXP).
intNOT NULL24
contract_memovarchar(1000)NULL
status
ChannelContractStatus(DRAFT/AWAITING_PAYMENT/ACTIVE/PARTIALLY_CANCELLED/TERMINATED/EXPIRED).
varchar(30)NOT NULL'DRAFT'::character varying
created_by_admin_idFK→adminsuuidNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

channel_distribution_jobs

BC-719 cols

BC-7 Channel: QR 배포 비동기 Job (API-CHN-007/008/009 — SIM-002-M03).

channel_contract_id → channel_contracts.idrequested_by_admin_id → admins.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
channel_contract_idFK→channel_contractsuuidNOT NULL
job_type
ChannelDistributionJobType(PRINT/DIGITAL).
varchar(20)NOT NULL
format
PRINT 이면 PDF/PNG, DIGITAL 이면 EMAIL/SMS.
varchar(20)NOT NULL
status
ChannelDistributionJobStatus 5상태 — 워커가 진행률 업데이트.
varchar(20)NOT NULL'QUEUED'::character varying
total_countintNOT NULL0
success_countintNOT NULL0
failed_countintNOT NULL0
paper_sizevarchar(20)NULL
batch_sizeintNULL
document_url
PRINT 완료 시 Blob Storage 다운로드 URL.
varchar(1000)NULL
failed_recipients
실패한 수신자 목록 JSONB (디지털만, [{codeId,email/phone,reason}]).
jsonbNOT NULL'[]'::jsonb
estimated_completion_attimestamptzNULL
queued_attimestamptzNOT NULLnow()
started_attimestamptzNULL
completed_attimestamptzNULL
requested_by_admin_idFK→adminsuuidNOT NULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

channel_notification_tasks

BC-715 cols

BC-7 Channel / DM-CHN-005: Channel 임계치 도달 통보 큐. PENDING→NOTIFIED→ACKNOWLEDGED 상태 머신 (BR-NTF-CHN-004).

handled_by_admin_id → admins.idassigned_admin_id → admins.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
channel_contract_id
계약 ID (FK channel_contracts.id, V075 에서 강제). 본 시점에는 어플리케이션 레벨 참조.
uuidNOT NULL
threshold_type
ChannelNotificationThresholdType (THRESHOLD_80/THRESHOLD_100/MANUAL). 자동 트리거는 unique partial index 로 멱등성 보장.
varchar(20)NOT NULL
status
ChannelNotificationTaskStatus (PENDING/NOTIFIED/ACKNOWLEDGED) — BR-NTF-CHN-004 상태 머신.
varchar(20)NOT NULL'PENDING'::character varying
detected_at
임계치 감지 시각 — ChannelExhaustionMonitor 가 INSERT 시 NOW() 로 채움.
timestamptzNOT NULLnow()
notified_at
BC-12 알림 발송 성공 시각 — markNotified() 가 채움.
timestamptzNULL
acknowledged_at
관리자 확인 시각 — acknowledge(adminId) 가 채움.
timestamptzNULL
handled_by_admin_idFK→admins
확인한 관리자 (FK admins, ON DELETE SET NULL).
uuidNULL
assigned_admin_idFK→admins
담당 관리자 (FK admins, ON DELETE SET NULL) — 없으면 BC-12 라우팅 정책으로 결정.
uuidNULL
notesvarchar(500)NULL
last_reminder_at
마지막 리마인더 발송 시각 (BR-NTF-CHN-005). 별도 ChannelNotificationReminderScheduler 가 갱신.
timestamptzNULL
reminder_count
누적 리마인더 발송 횟수 (>=0).
intNOT NULL0
channel_contact_info
기업 담당자 스냅샷 JSONB (이름/이메일/전화) — 임계치 도달 시점 값으로 보존. PHR 키 저장 금지 (BD-003).
jsonbNOT NULL'{}'::jsonb
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

channel_payments

BC-79 cols

BC-7 Channel / DM-CHN-002: B2B 결제 (관리자 직접 등록, BD-020). USD 고정 (BD-001).

channel_contract_id → channel_contracts.idregistered_by_admin_id → admins.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
channel_contract_idFK→channel_contractsuuidNOT NULL
amount_usd
총액 USD (>0).
numeric(14,2)NOT NULL
paid_attimestamptzNOT NULL
payment_method_note
외부 결제 수단 노트 (WIRE_TRANSFER 등 운영 메모).
varchar(500)NULL
registered_by_admin_idFK→adminsuuidNOT NULL
issuance_triggered_at
IntegratedVoucher 일괄 발행 outbox 적재 시각.
timestamptzNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

coupon_issuances

BC-1110 cols

BC-11 Promotion / DM-PRM-002: 사용자별 쿠폰 발급 인스턴스 (BR-PRM-002 중복 발급 차단, BR-PRM-003 만료 산출).

user_id → users.idcoupon_id → coupons.idorder_id → orders.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
coupon_idFK→coupons
발급된 쿠폰 정의 (FK coupons.id, ON DELETE RESTRICT).
uuidNOT NULL
user_idFK→users
발급 대상 사용자 (FK users.id, ON DELETE RESTRICT).
uuidNOT NULL
is_used
TRUE 면 주문에 적용·소진. used_at / order_id 와 동시 갱신 (CHECK 제약).
booleanNOT NULLfalse
used_at
주문 적용 시각 (markUsed 시 갱신).
timestamptzNULL
order_idFK→orders
적용된 주문 ID. V030 (orders) 추가 후 FK ALTER 예정.
uuidNULL
issued_at
발급 시각 (DEFAULT NOW()).
timestamptzNOT NULLnow()
expires_at
발급분 만료 시각. expires_at <= NOW() AND is_used = FALSE → EXPIRED (BR-PRM-003).
timestamptzNOT NULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

coupons

BC-1114 cols

BC-11 Promotion / DM-PRM-001: KARE 자체 쿠폰 정의 (BR-PRM-001).

created_by_admin_id → admins.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
name
관리자 화면에 노출되는 쿠폰명.
varchar(200)NOT NULL
discount_type
CouponDiscountType (PERCENTAGE/FIXED_AMOUNT).
varchar(20)NOT NULL
discount_value
PERCENTAGE 는 0~1 비율, FIXED_AMOUNT 는 USD 정액 (NUMERIC(10,4)).
numeric(10,4)NOT NULL
min_order_amount_usd
쿠폰 적용 가능 최소 주문 금액 (NULL = 제한 없음).
numeric(12,2)NULL
max_discount_amount_usd
PERCENTAGE 할인 시 상한 금액 (NULL = 제한 없음, FIXED_AMOUNT 시 무시).
numeric(12,2)NULL
valid_from
쿠폰 유효기간 시작.
timestamptzNOT NULL
valid_to
쿠폰 유효기간 종료. valid_to 경과 시 발급분은 BR-PRM-003 에 따라 EXPIRED 로 노출된다.
timestamptzNOT NULL
total_issue_limit
누적 발급 한도 (NULL = 무제한). issued_count 와 동시 발급 가드의 입력.
intNULL
issued_count
누적 발급 건수 (UPDATE 시 1씩 증가, BR-PRM-002 동시 발급 가드).
intNOT NULL0
status
CouponStatus(ACTIVE/INACTIVE) — INACTIVE 는 신규 발급 및 주문 적용 차단.
varchar(20)NOT NULL'ACTIVE'::character varying
created_by_admin_idFK→admins
쿠폰을 생성한 관리자 (FK admins, ON DELETE RESTRICT).
uuidNOT NULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

deliveries

BC-911 cols

BC-9 Fulfillment / DM-FLF-002 / ENT-036: 배송 추적 + 수령 QR 페이로드 (1:1 with fulfillment_orders).

fulfillment_order_id → fulfillment_orders.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
fulfillment_order_idFK→fulfillment_ordersuuidNOT NULL
qr_code_payload
단발 사용 수령 페이로드 (BR-FLF-RCV-002). 위·변조 시 400 QR_PAYLOAD_MISMATCH.
varchar(100)NOT NULL
status
DeliveryStatus(PENDING/SHIPPED/DELIVERED/RETURNED). DELIVERED = PA 수령 완료.
varchar(20)NOT NULL'PENDING'::character varying
tracking_numbervarchar(100)NULL
carriervarchar(100)NULL
shipped_attimestamptzNULL
delivered_attimestamptzNULL
received_by_partner_account_id
PA 수령자 (BR-FLF-RCV-001 소유권 검증 통과 후 기록). FK 강제는 partner_accounts 도입 후 별도 ALTER.
uuidNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

e_tickets

BC-612 cols

BC-6 Service / DM-SVC-001 / ENT-020: 사용자가 IV 에 등록한 항공편 정보.

ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
integrated_voucher_id
소속 Integrated Voucher (FK 는 BC-4 IV 마이그레이션에서 강제). UNIQUE = IV 당 1 eTicket (BR-SVC-001).
uuidNOT NULL
user_id
IV 소유자 (RLS-USR-001 빠른 필터). FK 는 BC-1 users 마이그레이션에서 강제.
uuidNOT NULL
flight_number
항공편명 (예: OZ123). 직접 입력은 NOT NULL 이지만 파싱 실패(FAILED) 흐름은 NULL 허용.
varchar(20)NULL
arrival_kst
도착 시각 (KST). 자동 예약(숙박) 의 체크인 일자 산출 기준.
timestamptzNULL
airline_code
IATA 항공사 코드 (옵션, 파싱 시 채워짐).
varchar(3)NULL
source_type
입력 방식 (MANUAL_INPUT / FILE_UPLOAD).
varchar(20)NOT NULL
blob_url
FILE_UPLOAD 흐름에서 Azure Blob URL. CHECK ck_et_file_blob_required 가 강제.
varchar(500)NULL
parse_status
파싱 결과 (FILE_UPLOAD 만 의미 — MANUAL_INPUT 은 NULL).
varchar(20)NULL
parsed_at
파싱 결과 확정 시각. PARSE_STATUS 와 1:1 동기화.
timestamptzNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

faq_categories

BC-109 cols

BC-10 Support / DM-SUP-004 / ENT-037: FAQ 카테고리 (접속 유형 + 표출 플랫폼 CSV).

created_by_admin_id → admins.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
name
카테고리 표시 이름 (단일 언어, ≤100자). 다국어는 향후 i18n_key 도입 시 분리 가능.
varchar(100)NOT NULL
target_audience
FaqAudience (USER/PARTNER). DOMAIN faq_audience (V002).
varchar(20)NOT NULL
display_platforms
표출 플랫폼 CSV (예: "UA" / "PW,PA"). BR-SUP-007~009. CHECK ck_fcat_display_platforms_format.
varchar(50)NOT NULL
display_order
카테고리 정렬 순서 (오름차순).
intNOT NULL0
is_active
활성화 여부 — FALSE 면 소속 FAQ 도 노출되지 않음 (BR-FAQ-002).
booleanNOT NULLtrue
created_by_admin_idFK→admins
작성 관리자 (FK admins, ON DELETE RESTRICT).
uuidNOT NULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

faqs

BC-109 cols

BC-10 Support / DM-SUP-003 / ENT-036: FAQ 본문 (다국어 question/answer JSONB, BD-018).

faq_category_id → faq_categories.idcreated_by_admin_id → admins.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
faq_category_idFK→faq_categories
소속 카테고리 (FK faq_categories, ON DELETE RESTRICT — 활성 카테고리 삭제 차단, BR-FQC-002).
uuidNOT NULL
questions
질문 다국어 Map(locale→text). 키: en/ar/ko/mn. PHR 키 저장 금지 (BD-003).
jsonbNOT NULL
answers
답변 다국어 Map(locale→text). 키: en/ar/ko/mn. PHR 키 저장 금지 (BD-003).
jsonbNOT NULL
display_order
카테고리 내 정렬 순서 (오름차순).
intNOT NULL0
is_published
게시 여부 — FALSE 면 노출 제외 (BR-FAQ-002).
booleanNOT NULLtrue
created_by_admin_idFK→admins
작성 관리자 (FK admins, ON DELETE RESTRICT).
uuidNOT NULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

fulfillment_orders

BC-913 cols

BC-9 Fulfillment / DM-FLF-001 / ENT-035: giftbox/관광상품권 실물 발주 헤더 (API-FLF-001~005).

created_by_admin_id → admins.idpartner_id → partners.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
partner_idFK→partners
발주 대상 파트너사 (호텔·여행사 등) — APPROVED 상태 검증은 application 레이어.
uuidNOT NULL
item_product_id
발주 대상 ItemProduct PK. FK 강제는 BC-2 product 테이블 도입 후 별도 ALTER.
uuidNOT NULL
quantity
발주 수량 (>=1).
intNOT NULL
destination_accommodation
도착지 숙소 표기 (호텔명·주소).
varchar(500)NOT NULL
expected_ship_date
예상 출고일 — 운영 SLA 추적용.
timestamptzNOT NULL
notevarchar(1000)NULL
status
FulfillmentOrderStatus(PENDING/SHIPPED/RECEIVED/CANCELLED).
varchar(20)NOT NULL'PENDING'::character varying
shipped_at
PENDING → SHIPPED 전이 시각 (관리자 발송 처리).
timestamptzNULL
received_at
SHIPPED → RECEIVED 전이 시각 (FulfillmentSvc 단독 — DR-PA-003).
timestamptzNULL
created_by_admin_idFK→adminsuuidNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

idempotency_keys

SYS10 cols

SYS / DM-SYS-003: BR-IDM-001 Idempotency-Key 상태 머신. 5개 적용 라우트의 중복 실행 방어.

ColumnTypeNullDefault
scopePK
라우트 기반 스코프 (예: 'payments.confirm') — TTL 정책·메트릭 라벨에 사용.
varchar(64)NOT NULL
idem_keyPK
클라이언트 제공 UUIDv4/ULID. 영숫자·하이픈·언더스코어 화이트리스트, ≤128자.
varchar(128)NOT NULL
request_hash
SHA-256(method + path + canonical body) hex 64자. hash 일치 시 응답 재생, 불일치 시 409 CONFLICT.
varchar(64)NOT NULL
status
IN_PROGRESS → COMPLETED 단방향 전이. FAILED 는 동일 hash 재시도 허용.
varchar(20)NOT NULL'IN_PROGRESS'::character varying
response_status
COMPLETED 시 응답 HTTP 상태. IN_PROGRESS 시 NULL.
intNULL
response_headers
COMPLETED 응답 헤더 스냅샷 (jsonb, PHR 비포함).
jsonbNULL
response_body
COMPLETED 응답 본문 스냅샷 (jsonb, BD-003 sanitize 적용).
jsonbNULL
ttl_expires_at
scope별 TTL — payments/transfers/checkout 24h, admin 발급 72h. 만료 행은 스케줄러가 정리.
timestamptzNOT NULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

inquiries

BC-1020 cols

BC-10 Support / DM-SUP-001 / ENT-034: 1:1 문의 (UA + PW 통합).

assigned_admin_id → admins.idpartner_account_id → partner_accounts.iduser_id → users.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
inquirer_type
작성자 유형 (BR-SUP-003). GENERAL_USER → user_id / PARTNER_ADMIN → partner_account_id (XOR).
varchar(30)NOT NULL
user_idFK→users
inquirer_type=GENERAL_USER 시 NOT NULL (FK users, ON DELETE RESTRICT).
uuidNULL
partner_account_idFK→partner_accounts
inquirer_type=PARTNER_ADMIN 시 NOT NULL (FK partner_accounts, ON DELETE RESTRICT).
uuidNULL
inquiry_type
InquiryType (CANCELLATION/REFUND/GENERAL/TECHNICAL/COMPLAINT). DOMAIN inquiry_type (V002).
varchar(20)NOT NULL
subject
제목 (≤200자, BD-003 PHR 사전 필터링 대상).
varchar(200)NOT NULL
content
본문 TEXT (BD-003 PHR 사전 필터링 대상 — Application 레이어 PhrSanitizer).
textNOT NULL
context_type
진입경로 (BR-SUP-PREFILL-001). EXPIRED_PASS/QR_REISSUE/ORDER_ORPHAN/GENERAL.
varchar(30)NOT NULL
related_integrated_voucher_id
EXPIRED_PASS / QR_REISSUE 진입 시 동반된 IntegratedVoucher.id (소프트 참조).
uuidNULL
related_order_id
ORDER_ORPHAN 진입 시 동반된 Order.id (소프트 참조).
uuidNULL
status
InquiryStatus (OPEN/IN_PROGRESS/CLOSED). DOMAIN inquiry_status (V002).
varchar(20)NOT NULL'OPEN'::character varying
assigned_admin_idFK→admins
담당 관리자 (FK admins, ON DELETE SET NULL).
uuidNULL
admin_response
관리자 답변 본문 (BD-003 PHR 사전 필터링 대상).
textNULL
closed_at
CLOSED 전환 시각 (status=CLOSED 시 NOT NULL).
timestamptzNULL
refund_status
환불 보조 상태 (BR-SUP-REF-001~003). DOMAIN inquiry_refund_status.
varchar(30)NOT NULL'NONE'::character varying
refund_requested_at
REFUND_PROCESSING 진입 시각 (refund_status=REFUND_PROCESSING 시 NOT NULL).
timestamptzNULL
refund_expected_by
환불 예상 완료일 (refund_requested_at + 14 영업일).
timestamptzNULL
refund_confirmed_at
REFUNDED 확정 시각 (refund_status=REFUNDED 시 NOT NULL).
timestamptzNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

integrated_product_items

BC-27 cols

BC-2 Product / DM-PRD-003 / ENT-009: IntegratedProduct ↔ ItemProduct M:N 연결.

item_product_id → item_products.idintegrated_product_id → integrated_products.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
integrated_product_idFK→integrated_products
상위 통합 상품 (FK integrated_products, ON DELETE CASCADE).
uuidNOT NULL
item_product_idFK→item_products
구성 세부 상품 (FK item_products, ON DELETE RESTRICT).
uuidNOT NULL
display_order
화면 표시 순서 (>=0). 동일 통합 상품 내 중복 허용.
intNOT NULL0
quantity
1 IntegratedVoucher 발행 당 ItemVoucher 발행 수량 (>0).
intNOT NULL1
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

integrated_products

BC-215 cols

BC-2 Product / DM-PRD-002 / ENT-008: KARE PASS 카탈로그 (결제 전 객체).

created_by_admin_id → admins.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
name
KARE PASS 명 (200자 제한).
varchar(200)NOT NULL
description
상품 설명 (선택). PHR 키 금지 (BD-003).
textNULL
price_usd
B2C USD 가격 (NUMERIC(12,2), CHECK >= 0).
numeric(12,2)NOT NULL
member_type
MemberType(FIXED/VARIABLE). FIXED 는 fixed_member_count, VARIABLE 은 max_addon_count 필수 (ck_ipc_member_shape).
varchar(20)NOT NULL
fixed_member_count
FIXED 시 고정 인원 수 (>=1). VARIABLE 시 NULL.
intNULL
max_addon_count
VARIABLE 시 최대 Add-on 인원 수 (>=0). FIXED 시 NULL.
intNULL
expiry_period_type
ExpiryPeriodType(2Y/3Y). 발행일 기준 유효 기간.
varchar(20)NOT NULL'2Y'::character varying
usage_period_hours
최초 사용(ACTIVE 전환) 후 이용 가능 시간 (>0).
intNOT NULL
addon_enabled
Add-on 추가구매 활성화 — VARIABLE 한정 (BR-IPC-003 / ck_ipc_addon_requires_variable).
booleanNOT NULLfalse
status
ProductStatus(DRAFT/ACTIVE/ARCHIVED).
varchar(20)NOT NULL'DRAFT'::character varying
is_visible
UA 노출 여부 — status=ACTIVE 한정 (ck_ipc_visibility_active).
booleanNOT NULLfalse
created_by_admin_idFK→admins
등록 관리자 (FK admins, ON DELETE SET NULL).
uuidNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

integrated_vouchers

BC-416 cols

BC-4 Voucher / DM-VCH-001 / ENT-014: KARE PASS 통합 바우처 8상태 머신.

user_id → users.idintegrated_product_id → integrated_products.idchannel_payment_id → channel_payments.idorder_id → orders.idcancelled_by_admin_id → admins.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
user_idFK→users
현재 소유자 (Transfer 시 user_id 갱신). FK users, ON DELETE RESTRICT.
uuidNOT NULL
order_idFK→orders
B2C 발행 출처 (channel_payment_id 와 XOR). FK orders, ON DELETE RESTRICT.
uuidNULL
channel_payment_idFK→channel_payments
B2B 발행 출처 (order_id 와 XOR). FK channel_payments, ON DELETE RESTRICT.
uuidNULL
integrated_product_idFK→integrated_products
발행 상품 (FK integrated_products, ON DELETE RESTRICT).
uuidNOT NULL
status
V002 integrated_voucher_status 도메인 — 8상태 머신.
varchar(20)NOT NULL'PENDING_CREATION'::character varying
member_count
동반자 포함 총 인원 (>= 1).
intNOT NULL
expiry_date
발행일 + expiry_period_type 기준 만료 시각 (스케줄러 후보).
timestamptzNOT NULL
usage_period_hours
IntegratedProduct.usage_period_hours 스냅샷 — 첫 사용 후 사용기한 산정용.
intNOT NULL
first_activated_at
최초 ACTIVE 전이 시각. 이후 usage_deadline = first_activated_at + usage_period_hours.
timestamptzNULL
usage_deadline
MIN(expiry_date, first_activated_at + usage_period_hours) 적용된 절대 만료 시각.
timestamptzNULL
cancelled_attimestamptzNULL
cancelled_by_admin_idFK→admins
관리자 단일 통제 — CANCELLED 전환 시 NOT NULL (ck_ivch_cancel_completeness).
uuidNULL
cancel_reasontextNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

item_products

BC-213 cols

BC-2 Product / DM-PRD-001 / ENT-007: 파트너사별 단일 서비스 카탈로그 (6개 카테고리).

created_by_admin_id → admins.idpartner_id → partners.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
partner_idFK→partners
서비스 제공 파트너 (FK partners, ON DELETE RESTRICT).
uuidNOT NULL
category
PartnerCategory (MEDICAL/AESTHETIC/MOBILITY/ACCOMMODATION/GIFTBOX/TOUR_VOUCHER).
varchar(20)NOT NULL
name
상품명 (200자 제한).
varchar(200)NOT NULL
description
상품 설명 (선택).
textNULL
price_usd
USD 단가 (NUMERIC(12,2), CHECK >= 0).
numeric(12,2)NOT NULL
status
ProductStatus(DRAFT/ACTIVE/ARCHIVED). DRAFT 진입 시 초기값.
varchar(20)NOT NULL'DRAFT'::character varying
is_visible
사용자 앱 노출 여부. status=ACTIVE 한정 (BR-IPD-002, ck_item_products_visibility_active).
booleanNOT NULLfalse
usage_period_hours
최초 사용(ACTIVE 전환) 후 이용 가능 시간 (NULL 허용 — 카테고리별 정책).
intNULL
category_metadata
카테고리별 메타데이터 (clinic_name·pickup_type·room_type 등). PHR 키 금지 (BD-003).
jsonbNULL
created_by_admin_idFK→admins
등록 관리자 (FK admins, ON DELETE SET NULL).
uuidNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

item_voucher_companions

BC-412 cols

BC-4 Voucher / DM-VCH-003 / ENT-016: BD-029 Add-on 동반자 정보 — IntegratedVoucher 단위 슬롯 순번 식별. PHR 비취급 (BD-003).

integrated_voucher_id → integrated_vouchers.idowner_id → users.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
integrated_voucher_idFK→integrated_vouchers
상위 PASS (FK integrated_vouchers, ON DELETE RESTRICT).
uuidNOT NULL
category
동반자가 사용 권한을 가진 카테고리 (V002 partner_category).
varchar(20)NOT NULL
slot_index
동일 (IV, category) 내부 순번 — uq_ivc_pass_category_slot 으로 중복 방지.
intNOT NULL
owner_idFK→users
Transfer 시 변경되는 슬롯 소유자 (FK users, ON DELETE SET NULL — soft 보존).
uuidNULL
full_namevarchar(200)NULL
passport_number_masked
마스킹된 여권번호 (예: A12*****34) — 평문 저장 금지.
varchar(50)NULL
birth_datedateNULL
gendervarchar(10)NULL
nationality
ISO-3166-1 alpha-3 국가 코드.
varchar(3)NULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

item_voucher_state_logs

BC-418 cols

BC-4 Voucher / DM-VCH-007 / ENT-020: ItemVoucher 상태 전이 감사 (Layer 2, append-only). BC-8 Settlement 정산 정본.

partner_id → partners.iditem_voucher_id → item_vouchers.idintegrated_voucher_id → integrated_vouchers.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
item_voucher_idFK→item_vouchers
대상 ItemVoucher (FK item_vouchers, ON DELETE RESTRICT).
uuidNOT NULL
integrated_voucher_idFK→integrated_vouchers
상위 IntegratedVoucher (denormalized, 감사·집계 효율).
uuidNOT NULL
partner_idFK→partners
제공 파트너 (denormalized, BR-PFS-005 정산 집계 인덱스).
uuidNOT NULL
categoryvarchar(20)NOT NULL
from_statusvarchar(20)NULL
to_statusvarchar(20)NOT NULL
quantity_delta
차감 수량 — REDEMPTION 시 음수, 신규 발행 시 양수, 단순 상태 전이 시 0.
intNOT NULL
remaining_after
본 트랜잭션 적용 후 ItemVoucher.remaining_quantity (>= 0).
intNOT NULL
face_value_usd
차감 시점 권면 금액 — 정산 집계 정본.
numeric(12,2)NOT NULL
redeemed_amount_usd
face_value_usd × |quantity_delta| — REDEMPTION 라인의 즉시 정산액.
numeric(12,2)NULL
redemption_record_id
BC-5 redemption_records.id (polymorphic — V050 시점 BC-5 부재로 FK 미부여).
uuidNULL
actor_typevarchar(20)NOT NULL
actor_iduuidNULL
trigger_typevarchar(40)NOT NULL
event_id
Outbox 멱등성 키 (uq_ivsl_event_id 부분 유니크).
uuidNULL
occurred_attimestamptzNOT NULLnow()
created_attimestamptzNOT NULLnow()

item_vouchers

BC-415 cols

BC-4 Voucher / DM-VCH-002 / ENT-015: IntegratedVoucher 종속 세부 바우처 — 독립 5상태 머신.

integrated_voucher_id → integrated_vouchers.idpartner_id → partners.iditem_product_id → item_products.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
integrated_voucher_idFK→integrated_vouchers
상위 PASS (FK integrated_vouchers, ON DELETE RESTRICT — 감사 이력 보호).
uuidNOT NULL
item_product_idFK→item_productsuuidNOT NULL
partner_idFK→partners
제공 파트너 (denormalized for 정산 집계 — BC-8 idx_ivh_partner_status).
uuidNOT NULL
category
파트너 카테고리 스냅샷 (V002 partner_category 도메인).
varchar(20)NOT NULL
statusvarchar(20)NOT NULL'ISSUED'::character varying
initial_quantity
발행 수량 (>= 1).
intNOT NULL
remaining_quantity
잔여 수량 — 단방향 차감 (trg_ivh_monotonic_decrement + ck_ivh_remaining_in_range).
intNOT NULL
face_value_usd
권면 금액 USD — 정산 집계 기준 (BR-PFS-005).
numeric(12,2)NOT NULL
activated_attimestamptzNULL
fully_used_attimestamptzNULL
expired_attimestamptzNULL
cancelled_attimestamptzNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

mobility_assignments

BC-610 cols

BC-6 Service / DM-SVC-003: 모빌리티 Booking 기사 배정 (Booking 1:1, RLS-PTN-006/007).

booking_id → bookings.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
booking_idFK→bookings
배정 대상 Booking (UNIQUE 1:1).
uuidNOT NULL
driver_partner_account_id
배정된 기사 PartnerAccount (NULL = 미배정 풀, RLS-PTN-006 Tier-2 가시 대상).
uuidNULL
assignment_type
AUTO = DRIVER 자가 승인 자동 배정 / MANUAL = STAFF·ADMIN 명시 지정 (RLS-PTN-007). MANUAL 건은 DRIVER 재할당 차단.
varchar(20)NOT NULL'AUTO'::character varying
status
PENDING(미배정 풀)·ACCEPTED·REASSIGNED 상태 머신.
varchar(20)NOT NULL'PENDING'::character varying
assigned_at
실제 driver 가 배정된 시각. 미배정 풀 행은 NULL.
timestamptzNULL
reassigned_from
재배정 시 이전 driver_partner_account_id (BR-SVC-007-005).
uuidNULL
reassignment_reasonvarchar(500)NULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

notices

BC-1011 cols

BC-10 Support / DM-SUP-002 / ENT-035: 공지사항 (다국어 본문 JSONB, BD-018).

created_by_admin_id → admins.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
titles
제목 다국어 Map(locale→text). 키: en/ar/ko/mn. PHR 키 저장 금지 (BD-003).
jsonbNOT NULL
contents
본문 다국어 Map(locale→text). 키: en/ar/ko/mn. PHR 키 저장 금지 (BD-003).
jsonbNOT NULL
target_audience
NoticeAudience (USER/PARTNER/ALL). DOMAIN notice_audience (V002).
varchar(20)NOT NULL
priority
NoticePriority (NORMAL/HIGH). DOMAIN notice_priority (V002).
varchar(20)NOT NULL'NORMAL'::character varying
is_published
게시 여부 — FALSE 면 모든 노출 채널에서 제외.
booleanNOT NULLfalse
display_from
노출 시작 시각 (BR-NTC-002).
timestamptzNOT NULL
display_to
노출 종료 시각 (NULL=영구 노출). display_to > display_from 강제.
timestamptzNULL
created_by_admin_idFK→admins
작성 관리자 (FK admins, ON DELETE RESTRICT — 감사 추적 보존).
uuidNOT NULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

notification_policies

BC-127 cols

BC-12 Notification / DM-NTF-002: 만료 임박 N일·PENDING_TRANSFER 자동 Recall 등 알림 정책 SSoT.

updated_by_admin_id → admins.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
policy_key
정책 키 (UNIQUE) — EXPIRY_REMINDER_DAYS / PENDING_TRANSFER_NOTIFY_ENABLED 등.
varchar(100)NOT NULL
policy_value
정책 본문 JSONB — 키별 자유 구조. 예: {"days":[30,7,1]} / {"enabled":true}. PHR 키 저장 금지 (BD-003).
jsonbNOT NULL
is_active
정책 활성화 여부 — FALSE 면 알림 발송 로직에서 무시.
booleanNOT NULLtrue
updated_by_admin_idFK→admins
마지막 변경 관리자 (FK admins, ON DELETE SET NULL).
uuidNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

notifications

BC-1222 cols

BC-12 Notification / DM-NTF-001 / ENT-033: 도메인 이벤트 기반 발송 이력 + 사용자 인박스 단일 테이블. Outbox(write) ↔ Inbox(read) 양면.

ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
recipient_user_id
폴리모픽 수신자 ID (USR→users.id / PTN→partner_accounts.id / ADM→admins.id). trg_notifications_recipient_fk 트리거 검증.
uuidNOT NULL
recipient_type
NotificationRecipientType (USR/PTN/ADM). CHECK ck_ntf_recipient_type.
varchar(20)NOT NULL
channel
NotificationChannel (PUSH/SMS/EMAIL/IN_APP). 도메인 notification_channel.
varchar(20)NOT NULL
event_type
NotificationEventType (29종). 도메인 notification_event_type (V002 + V015~V024 보강).
varchar(40)NOT NULL
locale
BCP-47 로케일 (en/ar/ko/mn). i18n 템플릿 출력 시점에 결정.
varchar(10)NOT NULL'en'::character varying
subject
제목 — UA 인박스 title. PUSH/EMAIL 채널은 외부 어댑터로 그대로 전달. PHR 비취급 (BD-003).
varchar(255)NULL
body_text
본문 — 모든 채널 공통. PHR 비취급 (BD-003) — PhrSanitizer 가 적재 단계에서 차단.
textNOT NULL
send_status
NotificationStatus (PENDING/SENT/FAILED/READ). 운영 dispatcher 상태 머신 — 사용자 응답에는 read_at 기준만 노출한다 (READ 값 직접 노출 금지).
varchar(20)NOT NULL'PENDING'::character varying
attempt_count
누적 발송 시도 횟수 (>=0). NotificationRetryPolicy 가 markFailed 시점에 +1.
intNOT NULL0
next_retry_at
다음 재시도 예정 시각 (BR-NTF-RTRY 지수 백오프). NULL = 재시도 없음 (DLQ 또는 SENT).
timestamptzNULL
sent_at
외부 어댑터 발송 성공 시각 — markSent() 시점. NULL = 미발송.
timestamptzNULL
read_at
사용자 읽음 시각 (UC-NTF-002/003). NULL = 미읽음. 읽음 표현은 본 컬럼 단일 SSoT (NotificationStatus.READ 는 dispatcher 운용 전용).
timestamptzNULL
provider_message_id
외부 게이트웨이 메시지 ID (FCM/APNs/SMS/EMAIL provider). 운영 디버깅용.
varchar(255)NULL
failure_reason
발송 실패 사유 (예외 클래스 + 메시지). markFailed() 시점에 기록.
varchar(500)NULL
source_event_id
도메인 이벤트 ID — 멱등 키 합성 + 추적. NotificationMessage.sourceEventId 와 매핑.
uuidNULL
related_booking_id
관련 예약 ID (BC-6) — 인박스 deeplink 용. 물리 FK 미적용 (cross-BC 참조).
uuidNULL
related_integrated_voucher_id
관련 IntegratedVoucher ID (BC-4) — 인박스 deeplink 용. 물리 FK 미적용 (cross-BC 참조).
uuidNULL
metadata
NotificationMessage.metadata JSONB (deeplink·식별자 등 비-PHR 메타). trg_notifications_metadata_phr_filter 가 PHR 키 차단 (BD-003).
jsonbNOT NULL'{}'::jsonb
idempotency_key
발송 멱등 키 — uq_ntf_idempotency_key 부분 UNIQUE. NULL 키는 sourceEventId+channel 합성으로 별도 가드.
varchar(150)NULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

order_items

BC-312 cols

BC-3 Order / DM-ORD-002: 주문 라인 스냅샷 (BD-003 PHR 비취급).

order_id → orders.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
order_idFK→ordersuuidNOT NULL
integrated_product_iduuidNOT NULL
product_snapshot
주문 시점 IntegratedProduct 화이트리스트 스냅샷. 진단명·처방·검사결과 일절 미포함.
jsonbNOT NULL
quantityintNOT NULL
addon_item_product_idsjsonbNOT NULL'{"ids": []}'::jsonb
member_optionjsonbNULL
unit_price_usdnumeric(12,2)NOT NULL
addon_total_usdnumeric(12,2)NOT NULL0
line_total_usdnumeric(12,2)NOT NULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

orders

BC-314 cols

BC-3 Order / DM-ORD-001: 주문 헤더 (BR-ORD-신규-002 PENDING → PAID 단방향).

coupon_issuance_id → coupon_issuances.iduser_id → users.idparent_order_id → orders.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
user_idFK→usersuuidNOT NULL
integrated_product_iduuidNULL
order_typevarchar(20)NOT NULL'B2C'::character varying
subtotal_usdnumeric(12,2)NOT NULL
discount_usdnumeric(12,2)NOT NULL0
total_amount_usdnumeric(12,2)NOT NULL
coupon_issuance_idFK→coupon_issuances
적용된 쿠폰 발급분 (FK coupon_issuances.id). 본 task 는 nullable 만 채운다 — 결제 승인 트랜잭션이 markUsed 호출.
uuidNULL
status
order_status 도메인 (V002, V012, V013).
varchar(20)NOT NULL'PENDING'::character varying
expires_at
결제 만료 시각 (created_at + SystemConfig order.paymentTtlMinutes, 기본 30분).
timestamptzNOT NULL
paid_attimestamptzNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()
parent_order_idFK→orders
Add-on 추가구매(B2C_ADDON) 의 원본 주문 (FK orders.id, ON DELETE RESTRICT). B2C 는 NULL (ck_orders_parent_addon_consistency).
uuidNULL

outbox_events

기타16 cols

DM-SYS-003 — Transactional Outbox (R04-H-02). Polling Relay → Azure Service Bus.

ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
event_id
발행 멱등성 키 (UUID). At-least-once delivery 의 dedup ID.
uuidNOT NULLgen_random_uuid()
event_typevarchar(100)NOT NULL
aggregate_typevarchar(50)NOT NULL
aggregate_iduuidNOT NULL
payloadjsonbNOT NULL'{}'::jsonb
headersjsonbNOT NULL'{}'::jsonb
statusvarchar(20)NOT NULL'PENDING'::character varying
retry_countintNOT NULL0
next_retry_attimestamptzNULL
published_attimestamptzNULL
last_attempt_attimestamptzNULL
last_errortextNULL
attempts
API-OBX-002 재시도 이력 — JSONB 배열. {attemptNo, attemptedAt, errorCode, errorMessage, durationMs}.
jsonbNOT NULL'[]'::jsonb
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

outbox_events_archive

기타17 cols

API-OBX-004 — Outbox 이벤트 폐기 보관 테이블 (DLQ → archive 이관).

ColumnTypeNullDefault
archive_idPKuuidNOT NULLgen_random_uuid()
original_id
폐기 직전 outbox_events.id (원본 행은 단일 트랜잭션에서 DELETE).
uuidNOT NULL
event_iduuidNOT NULL
event_typevarchar(100)NOT NULL
aggregate_typevarchar(50)NOT NULL
aggregate_iduuidNOT NULL
payloadjsonbNOT NULL
headersjsonbNOT NULL'{}'::jsonb
last_statusvarchar(20)NOT NULL
retry_countintNOT NULL0
last_errortextNULL
attemptsjsonbNOT NULL'[]'::jsonb
original_created_attimestamptzNOT NULL
discarded_attimestamptzNOT NULLnow()
discarded_byuuidNOT NULL
discard_reason
관리자 입력 폐기 사유 (BR-AUD-029 감사 trail 의 사유 컬럼과 동일).
varchar(500)NOT NULL
created_attimestamptzNOT NULLnow()

partner_accounts

BC-112 cols

BC-1 Identity / DM-ID-004: 파트너사 로그인 계정 (ADMIN/STAFF/DRIVER).

partner_id → partners.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
partner_idFK→partners
FK partners(id) ON DELETE CASCADE — 파트너사 삭제 시 소속 계정 일괄 제거.
uuidNOT NULL
email
로그인 이메일 (UNIQUE, 소문자 정규화).
varchar(255)NOT NULL
password_hash
bcrypt 해시 — 추후 SSO 도입 가능성 대비 NULLABLE.
textNULL
name
담당자 표시 이름.
varchar(100)NOT NULL
role
partner_account_role 도메인 (ADMIN/STAFF/DRIVER).
varchar(20)NOT NULL'STAFF'::character varying
status
partner_account_status 도메인 (ACTIVE/INACTIVE) — INACTIVE 는 로그인 차단.
varchar(20)NOT NULL'ACTIVE'::character varying
last_login_at
마지막 로그인 일시 (감사·휴면 분석용).
timestamptzNULL
token_version
BR-AUTH-010 — Refresh Token 무효화 카운터 (V025 정책의 partner_accounts 적용분).
intNOT NULL0
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()
lock_until
BR-AUTH-006 — 로그인 5회 연속 실패 잠금 만료 시각. NULL 이면 미잠금.
timestamptzNULL

partner_feature_settings

BC-110 cols

BC-1 Identity / DM-ID-005: 파트너별 기능 설정 + EXPIRED 정산율 SSoT (BR-PFS-002, BD-010).

partner_id → partners.idupdated_by_admin_id → admins.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
partner_idFK→partners
FK partners(id) ON DELETE CASCADE — Partner 1:1 (uq_pfs_partner).
uuidNOT NULL
manual_redemption_enabled
수동 사용처리(현장 코드 입력) 활성화 — 기본 false, 관리자 토글.
booleanNOT NULLfalse
expired_settlement_ratio
EXPIRED 상태 정산 비율 (0.0000~0.5000, BR-PFS-002 / BD-010). 정산 집계 시 본 SSoT 의 현재 값이 스냅샷된다.
numeric(5,4)NOT NULL0.0000
previous_manual_redemption_enabled
직전 수동 사용처리 토글 값 — AUD-026 Triple Timestamp 직전값 스냅샷.
booleanNULL
previous_expired_settlement_ratio
직전 EXPIRED 정산율 — 정산 집계가 변경 직전 값을 참조해야 할 때 1회 INSERT 만으로 추적.
numeric(5,4)NULL
last_change_reason
마지막 변경 사유 (관리자 입력, 최대 500자).
varchar(500)NULL
updated_by_admin_idFK→admins
마지막 수정자 — FK admins(id) ON DELETE SET NULL (계정 정리 후에도 본 행 유지).
uuidNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

partners

BC-115 cols

BC-1 Identity / DM-ID-003: 서비스 제공 파트너사. PartnerStatus 2값 (BD-009).

unsuspended_by_admin_id → admins.idsuspended_by_admin_id → admins.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
company_name
상호명.
varchar(200)NOT NULL
category
PartnerCategory (MEDICAL/AESTHETIC/MOBILITY/ACCOMMODATION/GIFTBOX/TOUR_VOUCHER).
varchar(20)NOT NULL
status
PartnerStatus(APPROVED/SUSPENDED) — 운영 중지 시 SUSPENDED + suspension_reason 필수 (BR-ID-017-001).
varchar(20)NOT NULL'APPROVED'::character varying
representative_name
대표자 이름.
varchar(100)NOT NULL
contact_email
대표 연락 이메일.
varchar(255)NOT NULL
contact_phone
대표 연락처 (선택).
varchar(50)NULL
business_registration_number
사업자등록번호 (선택, 국가별 포맷).
varchar(50)NULL
suspension_reason
운영 중지 사유 — SUSPENDED 전환 시 필수 (CHECK ck_partners_suspension_reason).
textNULL
suspended_at
운영 중지 일시.
timestamptzNULL
suspended_by_admin_idFK→admins
운영 중지 처리 관리자 (FK admins, ON DELETE SET NULL).
uuidNULL
unsuspended_at
운영 재개 일시.
timestamptzNULL
unsuspended_by_admin_idFK→admins
운영 재개 처리 관리자 (FK admins, ON DELETE SET NULL).
uuidNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

payments

BC-314 cols

BC-3 Order / DM-ORD-003 / ENT-013: PG 결제 승인·실패·환불 이력 (USD 단일 통화).

order_id → orders.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
order_idFK→orders
결제 대상 주문 (FK orders.id, UNIQUE — Order 1:1).
uuidNOT NULL
pg_provider
PG사 식별자 (V002 pg_provider 도메인). MVP: STRIPE.
varchar(20)NOT NULL
pg_transaction_id
PG 측 거래 식별자 (uq_payments_pg_tx — 글로벌 멱등 보장).
varchar(255)NOT NULL
amount_usd
결제 승인 금액 (USD). CHECK >= 0.
numeric(12,2)NOT NULL
statusvarchar(20)NOT NULL'PENDING'::character varying
approved_attimestamptzNULL
failed_attimestamptzNULL
cancelled_attimestamptzNULL
refund_amount_usd
누적 환불 금액. CHECK refund_amount_usd <= amount_usd (BR-PAY-002).
numeric(12,2)NULL
refunded_attimestamptzNULL
pg_raw_response
PG 응답 원문 JSONB (감사용). PHR 포함 금지 (BD-003).
jsonbNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

qr_codes

BC-410 cols

BC-4 Voucher / DM-VCH-004 / ENT-017: IntegratedVoucher 식별 QR — 1:ACTIVE+ N:REVOKED 누적.

integrated_voucher_id → integrated_vouchers.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
integrated_voucher_idFK→integrated_vouchers
대상 PASS (FK integrated_vouchers, ON DELETE RESTRICT).
uuidNOT NULL
code
QR 페이로드 (QR_VERSION + IV id + HMAC signature). uq_qr_code GLOBAL UNIQUE.
varchar(255)NOT NULL
version
재발급 버전 — 1부터 단조 증가.
intNOT NULL1
is_active
true = 현재 유효 / false = 무효화. uq_qr_active_iv 로 IV당 ACTIVE 1행 보장.
booleanNOT NULLtrue
issued_attimestamptzNOT NULLnow()
invalidated_attimestamptzNULL
invalidation_reason
REISSUED / VOUCHER_CANCELLED / SECURITY_COMPROMISE — is_active=false 시 NOT NULL.
varchar(50)NULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

redemption_records

BC-514 cols

BC-5 Redemption / DM-RDM-001 / ENT-021: ItemVoucher 차감 정본 이력 — QR 스캔 / 수동 사용처리 / 실물 수령. BD-017 Lock 순서 후행 INSERT.

partner_id → partners.iditem_voucher_id → item_vouchers.idintegrated_voucher_id → integrated_vouchers.idpartner_account_id → partner_accounts.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
item_voucher_idFK→item_vouchers
차감 대상 ItemVoucher (FK item_vouchers, ON DELETE RESTRICT — 감사 보존).
uuidNOT NULL
integrated_voucher_idFK→integrated_vouchers
상위 IntegratedVoucher (denormalized, BD-017 Lock 진단·이력 조회 효율).
uuidNOT NULL
partner_idFK→partners
제공 파트너 (denormalized, BC-8 정산 집계·idx_redemption_partner_processed).
uuidNOT NULL
partner_account_idFK→partner_accounts
처리 파트너 계정 (PA STAFF/DRIVER, PW PARTNER_ADMIN, 실물 수령 시 숙박 STAFF). FK partner_accounts, ON DELETE RESTRICT.
uuidNOT NULL
redemption_type
V002 redemption_type 도메인 (QR/MANUAL). BR-RDM-002 — 실물 수령 QR 스캔도 'QR' 로 기록.
varchar(20)NOT NULL
item_count
BD-031 일괄 차감 묶음 크기 — 본인 1 + Add-on N. 단일 ItemVoucher 차감이라도 >= 1.
intNOT NULL1
quantity_redeemed
차감 수량 (>= 1) — ItemVoucher.remaining_quantity 차감액과 동기.
intNOT NULL
remaining_after
차감 후 ItemVoucher.remaining_quantity 스냅샷 (>= 0) — item_voucher_state_logs 와 동기 검증용.
intNOT NULL
idempotency_key
SYS idempotency_keys.idem_key (scope='REDEMPTION') 와 동일 문자열. FK 아님 — append-only 추적용.
varchar(128)NULL
notes
처리 메모 (수동 처리 사유 등). BD-003 sanitizer 통과 후 저장 — PHR 키워드 금지.
varchar(500)NULL
processed_at
차감 트랜잭션 확정 시각 (NOW() 기본). BD-013 Grace Period 진단 기준.
timestamptzNOT NULLnow()
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

redemption_records_partitioned

기타14 cols

— DB 코멘트 없음 —

ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
item_voucher_iduuidNOT NULL
integrated_voucher_iduuidNOT NULL
partner_iduuidNOT NULL
partner_account_iduuidNOT NULL
redemption_typevarchar(20)NOT NULL
item_countintNOT NULL1
quantity_redeemedintNOT NULL
remaining_afterintNOT NULL
idempotency_keyvarchar(128)NULL
notesvarchar(500)NULL
processed_atPKtimestamptzNOT NULLnow()
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

settlement_batch_jobs

BC-813 cols

BC-8 Settlement / SettlementBatchJob: 월별 정산 배치 Job 실행 이력 (1 row = 1 시도).

parent_job_id → settlement_batch_jobs.idtriggered_by_admin_id → admins.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
settlement_month
YYYY-MM 형식 정산 월. CHECK 정규식 강제.
char(7)NOT NULL
status
BatchJobStatus(PENDING/RUNNING/SUCCESS/FAILED). PENDING→RUNNING→SUCCESS|FAILED.
varchar(20)NOT NULL'PENDING'::character varying
trigger_type
BatchTriggerType(SCHEDULED/MANUAL/RETRY). RETRY 는 parent_job_id 필수.
varchar(20)NOT NULL
retry_count
재실행 횟수 [0,3]. 한계 초과 시 BATCH_RETRY_LIMIT_EXCEEDED.
intNOT NULL0
parent_job_idFK→settlement_batch_jobs
RETRY 시 원본 Job PK. SCHEDULED/MANUAL 은 NULL.
uuidNULL
triggered_by_admin_idFK→admins
MANUAL/RETRY 트리거 관리자. SCHEDULED 는 NULL. FK admins ON DELETE SET NULL.
uuidNULL
started_attimestamptzNULL
completed_attimestamptzNULL
processed_partner_count
집계된 파트너 수 (진행 또는 완료 시점 기준).
intNOT NULL0
error_details
FAILED 시 에러 메타 JSONB. {code, message, stackTraceSummary, failedPartnerIds[]}.
jsonbNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

settlement_statements

BC-88 cols

BC-8 Settlement / DM-STL-002 / ENT-028: 정산 명세서 (Settlement 0..1, B2C/B2B 공통).

settlement_id → settlements.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
settlement_idFK→settlements
대상 정산 (FK settlements, UNIQUE — Settlement 0..1).
uuidNOT NULL
document_url
Azure Blob 객체 키 (PDF 등 명세서 파일). 평문 URL/SAS 가 아닌 객체 키만 보관.
textNOT NULL
status
SettlementStatementStatus(DRAFT/PUBLISHED/REVOKED). DOMAIN settlement_statement_status (V002).
varchar(20)NOT NULL'DRAFT'::character varying
issued_at
PUBLISHED 전환 시각 (status=PUBLISHED 시 NOT NULL — ck_..._published_requires_issued_at).
timestamptzNULL
revoked_at
REVOKED 전환 시각 (status=REVOKED 시 NOT NULL).
timestamptzNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

settlements

BC-823 cols

BC-8 Settlement / DM-STL-001 / ENT-027: 월별 정산 집계 헤더. B2C/B2B 공통(BD-015).

partner_id → partners.idconfirmed_by_admin_id → admins.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
partner_idFK→partners
정산 대상 파트너 (FK partners, ON DELETE RESTRICT).
uuidNOT NULL
settlement_month
YYYY-MM 형식 (CHAR(7), CHECK ck_settlements_month_format).
char(7)NOT NULL
total_redemption_count
FULLY_USED 차감 건수 누적.
intNOT NULL0
total_redemption_amount_usd
FULLY_USED 차감액 누적 (NUMERIC(12,2), CHECK >= 0).
numeric(12,2)NOT NULL0.00
expired_voucher_count
EXPIRED 전환 Voucher 수.
intNOT NULL0
expired_settlement_ratio
집계 시점 PartnerFeatureSetting.expired_settlement_ratio 스냅샷 (BR-PFS-004 / BR-STL-012). CHECK 0.0000 ≤ x ≤ 0.5000.
numeric(5,4)NOT NULL0.0000
expired_settlement_amount_usd
EXPIRED × ratio 정산 금액.
numeric(12,2)NOT NULL0.00
total_settlement_amount_usd
NORMAL 라인 총 정산액 (FULLY_USED + EXPIRED × ratio).
numeric(12,2)NOT NULL0.00
status
SettlementStatus(PENDING/CONFIRMED). DOMAIN settlement_status (V002).
varchar(20)NOT NULL'PENDING'::character varying
record_type
NORMAL=월별 본 집계, REVERSAL=강제 CANCELLED 차감 라인 (BR-STL-CALC-001).
varchar(20)NOT NULL'NORMAL'::character varying
batch_type
MONTHLY=월별 자동 배치, CHANNEL_TERMINATION=Channel 종료 30일 배치 (BR-STL-B2B-002).
varchar(30)NOT NULL'MONTHLY'::character varying
reversal_amount
REVERSAL 라인의 차감액 (음수). NORMAL 라인은 NULL.
numeric(12,2)NULL
original_item_id
REVERSAL 라인이 참조하는 원본 ItemVoucher.id.
uuidNULL
reversal_status
ReversalDisputeStatus(DISPUTED/RESOLVED_REJECTED/RESOLVED_ACCEPTED). NORMAL 라인은 NULL.
varchar(20)NULL
reversal_notified_attimestamptzNULL
reversal_grace_deadlinetimestamptzNULL
confirmed_at
AW가 PENDING→CONFIRMED 전환한 시각 (UC-NTF-006).
timestamptzNULL
confirmed_by_admin_idFK→admins
확정 처리 관리자 (FK admins, ON DELETE SET NULL).
uuidNULL
statement_document_url
API-STL-005 발행된 명세서 URL (캐시). 정규화된 행은 settlement_statements 테이블 참조.
varchar(1024)NULL
statement_issued_at
명세서 발행 시각.
timestamptzNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

system_config_logs

SYS11 cols

SYS / DM-SYS-002: NotificationPolicy + SystemConfig KV 변경 이력 (append-only). UC-NTF-007/008 정책 감사.

admin_id → admins.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
config_key
변경된 정책 키 (NotificationPolicy.policy_key 또는 SystemConfig.config_key).
varchar(100)NOT NULL
old_value
변경 직전 값 (JSONB). 첫 변경(legacy 미존재) 인 경우 정책 카탈로그 기본값.
jsonbNOT NULL
new_value
변경 후 값 (JSONB). PHR 키 저장 금지 (BD-003).
jsonbNOT NULL
admin_idFK→admins
변경 수행자 (FK admins, ON DELETE SET NULL).
uuidNULL
changed_at
변경 시각 (감사 SSoT).
timestamptzNOT NULLnow()
value_before
SYS / R04-IND-20: SystemConfig 변경 직전 스칼라 값 (TEXT). NotificationPolicy 경로에서는 NULL.
textNULL
value_after
SYS / R04-IND-20: SystemConfig 변경 후 스칼라 값 (TEXT). NotificationPolicy 경로에서는 NULL.
textNULL
change_reason
SYS / BR-SCL-002 / R04-IND-20: 변경 사유 (1~500자). API-CFG-002 필수 필드.
varchar(500)NULL
actor_ip
SYS / R04-IND-20: 변경 행위자 IP (INET, 감사 4요소).
inetNULL
user_agent
SYS / R04-IND-20: 변경 행위자 User-Agent 헤더 (감사 4요소).
varchar(500)NULL

system_configs

SYS12 cols

SYS / DM-SYS-001: 글로벌 런타임 파라미터 KV (R04-IND-20). BD-013 Grace Period·BD-017 statement_timeout 등 운영 파라미터 정본.

updated_by_admin_id → admins.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
config_key
파라미터 키 (UNIQUE) — GRACE_PERIOD_SECONDS / STATEMENT_TIMEOUT_MS / ADDON_MAX_COUNT 등.
varchar(100)NOT NULL
config_value
파라미터 값 (문자열 표현). 숫자·JSON·Boolean 도 모두 TEXT 로 저장 후 value_type 기반 파싱.
textNOT NULL
value_type
SystemConfigValueType (STRING/INTEGER/DECIMAL/BOOLEAN/DURATION/JSON) — 애플리케이션 측 파싱 단서.
varchar(20)NOT NULL
is_sensitive
민감 파라미터 여부 — TRUE 면 변경 시 재인증 요구·로그 마스킹 (BD-024 / R04-H-04).
booleanNOT NULLfalse
description
파라미터 설명 (운영자 가이드).
varchar(500)NULL
updated_by_admin_idFK→admins
마지막 변경 관리자 (FK admins, ON DELETE SET NULL). 상세 이력은 V016 system_config_logs.
uuidNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()
category
SYS / R04-IND-20: 운영 파라미터 분류 (VOUCHER/ORDER/DB/AUTH/NOTIFICATION). API-CFG-001 카테고리 필터.
varchar(20)NULL
min_value
SYS / R04-IND-20: value_type=INTEGER 시 허용 하한값 (BIGINT). NULL 허용.
bigintNULL
max_value
SYS / R04-IND-20: value_type=INTEGER 시 허용 상한값 (BIGINT). NULL 허용.
bigintNULL

upload_assets

SYS17 cols

SYS / 파일 업로드 통합 자산. FileUploadValidator → UploadStorageService → ClamAvScanWorker 파이프라인의 영속 상태. PHR 비취급(BD-003).

ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
owner_type
업로드 자산 소유 도메인 (예: ETICKET, SETTLEMENT_STATEMENT, INQUIRY_ATTACHMENT). FK 없음 — Polymorphic.
varchar(50)NOT NULL
owner_id
소유 도메인 row PK (UUID). owner_type 에 따라 e_tickets.id / inquiry_attachments.id 등.
uuidNULL
bucket
Azure Blob Storage 컨테이너 명. 격리 시 ${bucket}-quarantine 으로 이동.
varchar(120)NOT NULL
object_key
Blob 키: {policy}/{yyyy}/{MM}/{dd}/{uuid}.{ext}. UNIQUE — 워커가 blobKey 로 단일 row 식별.
varchar(500)NOT NULL
original_filename
BD-003 sanitize 처리된 안전 파일명 (PHR 키워드 제거 + ASCII 정규화). 원문 PHR 차단.
varchar(255)NOT NULL
mime_type
Magic Number 로 detect 된 실제 MIME (검증기 통과 후).
varchar(120)NOT NULL
size_bytes
파일 크기(byte). policy.maxSizeBytes 검증 통과 후 영속.
bigintNOT NULL
sha256
업로드 byte 의 SHA-256 hex (소문자 64). 무결성·중복 식별·감사.
char(64)NOT NULL
policy_name
UploadPolicy enum 명 (ETICKET / PROFILE_IMAGE / INQUIRY_DOC / ...). 라우트 그룹 식별.
varchar(40)NOT NULL
scan_status
PENDING → CLEAN | INFECTED | FAILED 단방향 ClamAV 스캔 상태.
varchar(20)NOT NULL'PENDING'::character varying
scan_requested_at
PENDING 상태로 row 가 생성되어 스캔 큐에 적재된 시각.
timestamptzNOT NULLnow()
scan_completed_at
워커가 종단 상태(CLEAN/INFECTED/FAILED) 로 갱신한 시각.
timestamptzNULL
quarantine_key
INFECTED 시 격리 컨테이너의 키(quarantine/원본 키). PENDING/CLEAN 시 NULL.
varchar(500)NULL
infection_signature
ClamAV 가 보고한 위협명 (예: Eicar-Test-Signature). PENDING/CLEAN/FAILED 시 NULL.
varchar(255)NULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

user_social_accounts

BC-17 cols

BC-1 Identity / DM-ID-002: Google/Apple/Facebook OAuth 연동 계정 (User 1:N).

user_id → users.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
user_idFK→users
FK users(id) ON DELETE CASCADE — 사용자 삭제 시 연동 정보도 함께 제거.
uuidNOT NULL
provider
social_provider 도메인 (GOOGLE/APPLE/FACEBOOK).
varchar(20)NOT NULL
provider_user_id
공급자 측 안정 식별자 (Google sub / Apple sub / Facebook id).
varchar(255)NOT NULL
provider_email
공급자 제공 이메일 — 가입·연동 시 스냅샷 (NOT synced thereafter, BR-ID-002-001).
varchar(255)NULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

users

BC-115 cols

BC-1 Identity / DM-ID-001: 외국인 의료관광 사용자 계정. status=DELETED 가 soft delete (BR-USR-003).

ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
email
로그인 이메일 (UNIQUE, 소문자 정규화).
varchar(255)NOT NULL
password_hash
bcrypt 해시. 소셜 전용 계정은 NULL.
textNULL
name
사용자 표시 이름.
varchar(100)NOT NULL
status
UserStatus(ACTIVE/SUSPENDED/DELETED) — DELETED 는 soft delete.
varchar(20)NOT NULL'ACTIVE'::character varying
preferred_language
BCP-47 언어 코드 (en/ar/ko/mn 등). UA 기본 en, AW/PW/PA 기본 ko (애플리케이션 결정).
varchar(10)NOT NULL
last_login_at
마지막 로그인 일시 (휴면 계정 분석·감사용).
timestamptzNULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()
token_version
BR-AUTH-010 — Refresh Token 무효화 카운터. JWT tv 클레임과 일치해야 통과. 로그아웃·비밀번호 재설정·정지 시 +=1.
intNOT NULL0
deletion_requested_at
BR-AUTH-005 사전 검증 통과 시점. status=DELETION_PENDING 진입 시 채워지며, 관리자 승인 후 status=DELETED 로 전이되어도 보존된다.
timestamptzNULL
nationality
사용자 국적 (ISO 3166-1 alpha-2 또는 자연어, BD-003 비-PHR).
varchar(50)NULL
phone
사용자 연락처 (PII — AW reveal 시 X-Reauth-Token, BD-003 비-PHR).
varchar(20)NULL
deletion_reason
계정 삭제 요청 사유 (사용자 입력, AW 검토 큐 표시).
textNULL
lock_until
BR-AUTH-006 — 로그인 5회 연속 실패 잠금 만료 시각. NULL 이면 미잠금. LoginAttemptService 가 SSoT 로 갱신.
timestamptzNULL

voucher_cancel_requests

BC-417 cols

BC-4 / API-VCH-016~019 — Voucher Cancel SoD 잠금 행. PARTNER_ADMIN 요청 → ADM 승인/반려 2단계 워크플로우. IV/Item 5상태 머신과 분리.

approved_or_rejected_by_admin_id → admins.idpartner_id → partners.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
voucher_id
Polymorphic 참조 (FK 없음) — IV 마이그레이션(V040+) 부착 후에도 cascade 영향 회피.
uuidNOT NULL
partner_idFK→partners
요청 주체 파트너사 PK. PARTNER_ADMIN 본사 범위(✅*) 검증의 기준.
uuidNOT NULL
requested_by_account_id
Polymorphic 참조 (FK 없음) — 요청을 제출한 PartnerAccount PK. AUD-030 요청자 4필드 1호.
uuidNOT NULL
requested_at
요청 제출 시각 — AUD-030 요청자 4필드 2호 (이벤트 발생 시각).
timestamptzNOT NULL
reason_code
UX 카피 카탈로그 매핑용 사유 코드 (PARTNER_OPERATIONAL / CUSTOMER_DISPUTE / DUPLICATE_PURCHASE / PRODUCT_UNAVAILABLE / FRAUD_SUSPECTED / OTHER).
varchar(40)NOT NULL
reason_detail
자유 텍스트 사유(2000자 이내). PHR 비취급(BD-003) — 진단명·처방·검사결과 저장 금지.
varchar(2000)NULL
status
REQUESTED → APPROVED | REJECTED | WITHDRAWN 단방향 전이.
varchar(20)NOT NULL'REQUESTED'::character varying
approved_or_rejected_by_admin_idFK→admins
결정을 내린 ADM PK (APPROVED/REJECTED 시 필수). admin 삭제 시 SET NULL.
uuidNULL
decision_at
APPROVED/REJECTED 처리 시각. WITHDRAWN/REQUESTED 시 NULL.
timestamptzNULL
decision_note
관리자 결정 메모(반려 사유 등). 2000자 이내, PHR 비취급.
varchar(2000)NULL
request_ip
AUD-030 요청자 4필드 3호 — 요청 발생 IP (INET).
inetNULL
request_user_agent
AUD-030 요청자 4필드 4호 — 요청 발생 User-Agent.
varchar(500)NULL
decision_ip
AUD-030 승인자 감사 필드 — 결정 발생 IP (INET).
inetNULL
decision_user_agent
AUD-030 승인자 감사 필드 — 결정 발생 User-Agent.
varchar(500)NULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

voucher_integrity_drifts

BC-415 cols

BC-4 / BR-IVC-015 — 1h 배치가 적재한 Voucher invariant 위반 잠금 행. LOCKED → RESOLVED 단방향. 상태 머신은 IV/IVI 와 분리.

ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
integrated_voucher_id
Polymorphic 참조 (FK 없음). cascade 삭제 / archive 영향 회피.
uuidNOT NULL
item_voucher_id
NULL = IntegratedVoucher 레벨 invariant. 비-NULL = 특정 Item 레벨.
uuidNULL
drift_type
BR-IVC-015 invariant 카테고리 (QUANTITY_MISMATCH / STATE_INVARIANT_VIOLATION / EXPIRY_DRIFT / SETTLEMENT_AMOUNT_DRIFT).
varchar(40)NOT NULL
detected_attimestamptzNOT NULL
expected_snapshot
invariant 검출 당시 expected 값 JSONB. drift_type 별 자유 형식.
jsonbNOT NULL'{}'::jsonb
actual_snapshot
invariant 검출 당시 actual 값 JSONB.
jsonbNOT NULL'{}'::jsonb
status
LOCKED → RESOLVED 단방향 운영 상태. IntegratedVoucher 의 5개 상태와 무관.
varchar(20)NOT NULL'LOCKED'::character varying
locked_attimestamptzNOT NULL
resolved_attimestamptzNULL
resolved_byuuidNULL
resolution_note
관리자가 잠금 해제 시 입력한 자유 텍스트 (1~2000자, RESOLVED 단계 필수).
varchar(2000)NULL
root_cause
DATA_RACE / MIGRATION_GAP / EXTERNAL_SYNC / OTHER 중 1개. RESOLVED 단계 필수.
varchar(30)NULL
batch_run_id
1h 배치 실행 ID (UUID). 운영 디버깅/메트릭 라벨에 사용.
uuidNOT NULL
created_attimestamptzNOT NULLnow()

voucher_state_logs

BC-411 cols

BC-4 Voucher / DM-VCH-006 / ENT-019: IntegratedVoucher 상태 전이 감사 (Layer 1, append-only).

integrated_voucher_id → integrated_vouchers.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
integrated_voucher_idFK→integrated_vouchers
대상 PASS (FK integrated_vouchers, ON DELETE RESTRICT — 감사 보존).
uuidNOT NULL
from_status
직전 상태 (최초 INSERT 는 NULL, 이후 행은 NOT NULL 권장).
varchar(30)NULL
to_status
전환 후 상태 (8상태 머신 enum 값).
varchar(30)NOT NULL
trigger_type
V002 voucher_state_trigger_type — 13개 세부 트리거 (PAYMENT_APPROVED 등).
varchar(40)NOT NULL
actor_type
SYSTEM/USER/PARTNER/ADMIN — ck_vsl_actor_type.
varchar(20)NOT NULL
actor_iduuidNULL
reasonvarchar(500)NULL
event_id
Outbox 멱등성 키 (uq_vsl_event_id 부분 유니크 — 동일 이벤트 중복 INSERT 차단).
uuidNULL
occurred_attimestamptzNOT NULLnow()
created_attimestamptzNOT NULLnow()

voucher_transfers

BC-412 cols

BC-4 Voucher / DM-VCH-005 / ENT-018: PASS Transfer(선물하기) 요청 이력 — PENDING/ACCEPTED/CANCELLED.

sender_user_id → users.idreceiver_user_id → users.idintegrated_voucher_id → integrated_vouchers.id
ColumnTypeNullDefault
idPKuuidNOT NULLgen_random_uuid()
integrated_voucher_idFK→integrated_vouchers
대상 PASS (FK integrated_vouchers, ON DELETE RESTRICT).
uuidNOT NULL
sender_user_idFK→users
발신자 — 요청 시점 IV 소유자.
uuidNOT NULL
receiver_email
수신자 이메일 (계정 미가입 상태에서도 발송 가능).
varchar(255)NOT NULL
receiver_user_idFK→users
수락 후 매칭된 수신자 User PK (ACCEPTED 시 NOT NULL).
uuidNULL
status
V002 voucher_transfer_status (PENDING/ACCEPTED/CANCELLED). PENDING 동안 uq_vt_pending_iv 단일성.
varchar(20)NOT NULL'PENDING'::character varying
requested_attimestamptzNOT NULLnow()
accepted_attimestamptzNULL
cancelled_attimestamptzNULL
cancel_reasonvarchar(255)NULL
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()