③ Data · DB 스키마
기존 p25 sos_events·emergency_contacts 재활용 + 알림 추적 sos_notifications 신설.
sbdb · DDL
-- 긴급 연락처 (우선순위)
CREATE TABLE emergency_contacts (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
name VARCHAR(50),
phone VARCHAR(20) NOT NULL,
relation VARCHAR(20),
priority TINYINT DEFAULT 1, -- 1이 최우선
channel SET('push','sms','call') DEFAULT 'push,sms,call',
INDEX idx_user_pri (user_id, priority),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- SOS 이벤트
CREATE TABLE sos_events (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
source ENUM('manual','voice','fall','no_response') NOT NULL,
status ENUM('triggered','confirming','escalating','acknowledged','resolved') DEFAULT 'triggered',
lat DECIMAL(10,7), lng DECIMAL(10,7),
resolution ENUM('real','false_alarm','unknown') NULL,
ack_by BIGINT NULL, -- 확인한 사용자 id
triggered_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
resolved_at TIMESTAMP NULL,
INDEX idx_user_status (user_id, status),
FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ★ 신설: 알림 발송 추적 (이중화 보장·감사)
CREATE TABLE sos_notifications (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
sos_id BIGINT NOT NULL,
contact_id BIGINT NULL, -- 119는 NULL
channel ENUM('push','sms','call','gov','119'),
step TINYINT, -- 에스컬레이션 단계
status ENUM('sent','failed','delivered','acked') DEFAULT 'sent',
sent_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_sos (sos_id),
FOREIGN KEY (sos_id) REFERENCES sos_events(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
설계 포인트 — sos_notifications가 "누구에게·어떤 채널로·성공했는지"를 모두 기록 → 무응답 판정과 이중화 재시도, 사후 감사의 근거.