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

Module Thông báo Email
EMAIL
Phiên bản1.0
Hệ thốngHệ thống Xác thực
ModuleEMAIL - Thông báo Email
Cơ sở dữ liệuemail_db
Ngày tạo2026-07-24
Tác giảNam Nguyen
Trạng tháiNháp
SRS liên quanSRS Thông báo Email

Mục lục

1. Giới thiệu

1.1 Mục đích

Tài liệu này mô tả thiết kế cơ sở dữ liệu cho module Thông báo Email, bao gồm schema, chỉ mục và script di chuyển.

1.2 Tổng quan Cơ sở dữ liệu

Thuộc tínhGiá trị
Tên Cơ sở dữ liệuemail_db
ModuleEMAIL - Thông báo Email
Bảngemail_logs
EnginePostgreSQL

2. Sơ đồ Quan hệ Thực thể

Sơ đồ ERD
Hình 1: ERD Thông báo Email

3. Định nghĩa Bảng

3.1 email_logs

Lưu log giao email bao gồm người nhận, chủ đề, trạng thái và chi tiết nhà cung cấp.

CộtLoạiRàng buộcMô tả
iduuidPK, NOT NULL, DEFAULT gen_random_uuid()Mã định danh duy nhất
user_iduuidNOT NULLMã người dùng liên kết
emailvarchar(255)NOT NULLĐịa chỉ email người nhận
subjectvarchar(500)NOT NULLChủ đề email
template_idvarchar(100)NOT NULLMã định danh mẫu email
statusenum('pending','sent','delivered','failed')NOT NULL, DEFAULT 'pending'Trạng thái giao dịch
providervarchar(50)NOT NULLTên nhà cung cấp email (sendgrid, smtp)
provider_message_idvarchar(100)NULLMã tin nhắn của nhà cung cấp để theo dõi
error_messagetextNULLChi tiết lỗi nếu giao email thất bại
retry_countintegerNOT NULL, DEFAULT 0Số lần thử lại
metadatajsonbNULLDữ liệu ngữ cảnh bổ sung (OTP, biến mẫu)
sent_attimestampNULLThời gian gửi email đến nhà cung cấp
delivered_attimestampNULLThời gian email được giao cho người nhận
created_attimestampNOT NULL, DEFAULT NOW()Thời gian tạo bản ghi

SQL CREATE TABLE

CREATE TABLE email_logs (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id UUID NOT NULL,
  email VARCHAR(255) NOT NULL,
  subject VARCHAR(500) NOT NULL,
  template_id VARCHAR(100) NOT NULL,
  status VARCHAR(20) NOT NULL DEFAULT 'pending'
    CHECK (status IN ('pending', 'sent', 'delivered', 'failed')),
  provider VARCHAR(50) NOT NULL,
  provider_message_id VARCHAR(100),
  error_message TEXT,
  retry_count INTEGER NOT NULL DEFAULT 0,
  metadata JSONB,
  sent_at TIMESTAMP,
  delivered_at TIMESTAMP,
  created_at TIMESTAMP NOT NULL DEFAULT NOW()
);

4. Chỉ mục

Tên Chỉ mụcBảngCộtMục đích
idx_email_logs_user_idemail_logsuser_idTruy vấn email theo người dùng
idx_email_logs_statusemail_logsstatusLọc theo trạng thái giao dịch
idx_email_logs_created_atemail_logscreated_atTruy vấn theo thời gian và dọn dẹp
idx_email_logs_provider_message_idemail_logsprovider_message_idTra cứu theo mã tin nhắn nhà cung cấp

SQL CREATE INDEXES

CREATE INDEX idx_email_logs_user_id ON email_logs (user_id);
CREATE INDEX idx_email_logs_status ON email_logs (status);
CREATE INDEX idx_email_logs_created_at ON email_logs (created_at);
CREATE INDEX idx_email_logs_provider_message_id ON email_logs (provider_message_id);

5. Script Di chuyển

5.1 Di chuyển Ban đầu

-- Di chuyển: Tạo bảng email_logs
-- Ngày: 2026-07-24
-- Module: EMAIL

BEGIN;

CREATE TABLE email_logs (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id UUID NOT NULL,
  email VARCHAR(255) NOT NULL,
  subject VARCHAR(500) NOT NULL,
  template_id VARCHAR(100) NOT NULL,
  status VARCHAR(20) NOT NULL DEFAULT 'pending'
    CHECK (status IN ('pending', 'sent', 'delivered', 'failed')),
  provider VARCHAR(50) NOT NULL,
  provider_message_id VARCHAR(100),
  error_message TEXT,
  retry_count INTEGER NOT NULL DEFAULT 0,
  metadata JSONB,
  sent_at TIMESTAMP,
  delivered_at TIMESTAMP,
  created_at TIMESTAMP NOT NULL DEFAULT NOW()
);

CREATE INDEX idx_email_logs_user_id ON email_logs (user_id);
CREATE INDEX idx_email_logs_status ON email_logs (status);
CREATE INDEX idx_email_logs_created_at ON email_logs (created_at);
CREATE INDEX idx_email_logs_provider_message_id ON email_logs (provider_message_id);

COMMIT;