Tài liệu Thiết kế Cơ sở dữ liệu
Module Dịch vụ SMS
SMS
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 SRS | Giải pháp Cơ sở dữ liệu |
| FR-001 Gửi SMS OTP | Bảng sms_logs |
| FR-003 Ghi log Giao dịch | Bảng sms_logs (cập nhật trạng thái) |
| NFR-004 Lưu trữ 90 ngày | Chính sách lưu trữ |
1.3 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ạnh | Quyết định |
| Cơ sở dữ liệu | sms_db |
| Đặt tên bảng | sms_<table_name> |
| Khóa chính | UUID (qua gen_random_uuid()) |
| Thời gian | created_at, updated_at với mặc định NOW() |
2.2 Bảng: sms_logs
| Cột | Loại | Cho phép NULL | Mặc định | Mô tả |
| id | uuid | KHÔNG | gen_random_uuid() | Khóa chính |
| user_id | uuid | CO | NULL | Người dùng liên kết (từ AUTH) |
| phone | varchar(20) | KHÔNG | - | Số điện thoại người nhận |
| message | text | KHÔNG | - | Nội dung tin nhắn SMS |
| otp_code | varchar(10) | CO | NULL | Mã OTP (nếu có) |
| status | varchar(20) | KHÔNG | pending | pending, sent, delivered, failed |
| provider | varchar(50) | KHÔNG | twilio | Tên nhà cung cấp SMS |
| provider_message_id | varchar(100) | CO | NULL | Mã tin nhắn của nhà cung cấp |
| error_message | text | CO | NULL | Thông báo lỗi nếu thất bại |
| retry_count | integer | KHÔNG | 0 | Số lần thử lại |
| expires_at | timestamp | CO | NULL | Thời gian hết hạn OTP |
| sent_at | timestamp | CO | NULL | Thời gian gửi SMS |
| delivered_at | timestamp | CO | NULL | Thời gian SMS được giao |
| created_at | timestamp | KHÔNG | NOW() | 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ạnh | Quyết định |
| Công cụ | Drizzle ORM (drizzle-kit) |
| Cơ sở dữ liệu | sms_db |
| Hoàn tác | Bắt buộc cho mỗi lần di chuyển |
4.2 Thứ tự Di chuyển
| Thứ tự | Di chuyển | Mô tả |
| 1 | 001_create_sms_logs | Tạo bảng sms_logs |
| 2 | 002_create_indexes | Tạo tất cả chỉ mục |
5. Từ điển Dữ liệu
| Bảng | Mô tả | Giải quyết | Ước tính Dòng (Năm 1) |
| sms_logs | Log giao dịch SMS và lưu vết kiểm toán | FR-001, FR-003 | 500.000 |