Tài liệu Thiết kế Cơ sở dữ liệu

Module Dịch vụ SMS
SMS
Phiên bản1.0
Hệ thốngHệ thống Xác thực
ModuleSMS - Dịch vụ SMS
Cơ sở dữ liệusms_db
ORMDrizzle ORM
Ngày tạo2026-08-05
Tác giảNam Nguyen
SRS liên quanSRS Dịch vụ SMS

Mục lục

1. Tổng quan

1.1 Mục đích

Tài liệu này định nghĩa thiết kế cơ sở dữ liệu cho module Dịch vụ SMS (cơ sở dữ liệu: sms_db).

1.2 Yêu cầu được giải quyết

Yêu cầu SRSGiải pháp Cơ sở dữ liệu
FR-001 Gửi SMS OTPBảng sms_logs
FR-003 Ghi log Giao dịchBảng sms_logs (cập nhật trạng thái)
NFR-004 Lưu trữ 90 ngàyChính sách lưu trữ

1.3 Sơ đồ ERD

Sơ đồ ERD
Hình 1: ERD Dịch vụ SMS

2. Thiết kế Schema

2.1 Chiến lược Cơ sở dữ liệu

Khía cạnhQuyết định
Cơ sở dữ liệusms_db
Đặt tên bảngsms_<table_name>
Khóa chínhUUID (qua gen_random_uuid())
Thời giancreated_at, updated_at với mặc định NOW()

2.2 Bảng: sms_logs

CộtLoạiCho phép NULLMặc địnhMô tả
iduuidKHÔNGgen_random_uuid()Khóa chính
user_iduuidCONULLNgười dùng liên kết (từ AUTH)
phonevarchar(20)KHÔNG-Số điện thoại người nhận
messagetextKHÔNG-Nội dung tin nhắn SMS
otp_codevarchar(10)CONULLMã OTP (nếu có)
statusvarchar(20)KHÔNGpendingpending, sent, delivered, failed
providervarchar(50)KHÔNGtwilioTên nhà cung cấp SMS
provider_message_idvarchar(100)CONULLMã tin nhắn của nhà cung cấp
error_messagetextCONULLThông báo lỗi nếu thất bại
retry_countintegerKHÔNG0Số lần thử lại
expires_attimestampCONULLThời gian hết hạn OTP
sent_attimestampCONULLThời gian gửi SMS
delivered_attimestampCONULLThời gian SMS được giao
created_attimestampKHÔNGNOW()Thời gian tạo bản ghi
CREATE TABLE sms_logs (
  id                    UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id               UUID,
  phone                 VARCHAR(20) NOT NULL,
  message               TEXT NOT NULL,
  otp_code              VARCHAR(10),
  status                VARCHAR(20) NOT NULL DEFAULT 'pending'
                        CHECK (status IN ('pending', 'sent', 'delivered', 'failed')),
  provider              VARCHAR(50) NOT NULL DEFAULT 'twilio',
  provider_message_id   VARCHAR(100),
  error_message         TEXT,
  retry_count           INTEGER NOT NULL DEFAULT 0,
  expires_at            TIMESTAMP,
  sent_at               TIMESTAMP,
  delivered_at          TIMESTAMP,
  created_at            TIMESTAMP NOT NULL DEFAULT NOW()
);

3. Chỉ mục

-- sms_logs
CREATE INDEX idx_sms_logs_user_id ON sms_logs(user_id);
CREATE INDEX idx_sms_logs_phone ON sms_logs(phone);
CREATE INDEX idx_sms_logs_status ON sms_logs(status);
CREATE INDEX idx_sms_logs_created_at ON sms_logs(created_at DESC);
CREATE INDEX idx_sms_logs_provider_message_id ON sms_logs(provider_message_id);

4. Di chuyển dữ liệu

4.1 Chiến lược Di chuyển

Khía cạnhQuyết định
Công cụDrizzle ORM (drizzle-kit)
Cơ sở dữ liệusms_db
Hoàn tácBắt buộc cho mỗi lần di chuyển

4.2 Thứ tự Di chuyển

Thứ tựDi chuyểnMô tả
1001_create_sms_logsTạo bảng sms_logs
2002_create_indexesTạo tất cả chỉ mục

5. Từ điển Dữ liệu

BảngMô tảGiải quyếtƯớc tính Dòng (Năm 1)
sms_logsLog giao dịch SMS và lưu vết kiểm toánFR-001, FR-003500.000