EngineeringSenior DeveloperSQL Deep Dive

SQL Architectural Patterns – Hướng dẫn Thiết kế

Mục tiêu

Cung cấp tài liệu tham khảo cho cấp độ Senior, ánh xạ các mẫu kiến trúc phần mềm (Clean Architecture, Microservices, Event-Driven, CQRS) với các quyết định thiết kế SQL Server (bố cục schema, multi-tenancy, tính nhất quán dữ liệu, chiến lược migration).

1. Clean Architecture / Onion

  • Mỗi Bounded Context một Database (hoặc Schema) – mỗi module cốt lõi sở hữu một schema riêng (ví dụ: dbo, sales, inventory).
  • Schema theo Layer không được khuyến khích; thay vào đó hãy nhóm các bảng theo domain.
  • Migrations: Sử dụng EF Core migrations hoặc SQLPackage để quản lý phiên bản schema. Lưu trữ script migration trong thư mục Database/Migrations/.
  • Chiến lược Backup: Full backup hàng tuần + differential hàng ngày + transaction-log mỗi 15 phút. Lưu trữ backup trong Azure Blob với chính sách immutable (không thể thay đổi).
  • Ví dụ:
    sql
    CREATE SCHEMA sales;
    CREATE TABLE sales.Customers (
        Id UNIQUEIDENTIFIER PRIMARY KEY,
        Name NVARCHAR(200) NOT NULL,
        Email NVARCHAR(200) NOT NULL UNIQUE,
        CreatedAt DATETIME2 DEFAULT SYSUTCDATETIME()
    );
    

2. Microservices (Database per Service)

  • Cách ly (Isolation): Mỗi microservice có một SQL Database riêng (hoặc Elastic Pool) – loại bỏ việc khóa chéo cơ sở dữ liệu (cross-service locking).
  • Sao chép dữ liệu (Data Replication): Sử dụng Transactional Replication hoặc Change Data Capture (CDC) + Azure Data Factory để đồng bộ hóa read-models.
  • Backup: Azure SQL Managed Instance – khôi phục theo thời điểm (PITR) được bật theo mặc định. Đối với on-prem, bật Log Shipping đến region phụ.
  • Ví dụ – Service Order sở hữu DB Orders; Service Customer sở hữu DB Customers. Truy vấn chéo service thực hiện thông qua API hoặc Đồng bộ hướng sự kiện (Event-driven sync).

3. Event-Driven Architecture (Kiến trúc hướng sự kiện)

  • Event Store dạng Append-only: Lưu các event domain vào một bảng duy nhất EventStore.Events với các cột (EventId, AggregateId, EventType, Payload, CreatedAt).
  • Projection DB: Xây dựng các bảng read-model (OrderReadModel) sử dụng Azure Functions hoặc SQL Server Change Tracking.
  • Backup: Do event store là append-only, bật tính năng lưu trữ dài hạn (long-term retention - ví dụ 7 năm) sử dụng Azure Blob Archive.
  • Ví dụ:
    sql
    CREATE TABLE EventStore.Events (
        EventId UNIQUEIDENTIFIER PRIMARY KEY,
        AggregateId UNIQUEIDENTIFIER NOT NULL,
        EventType NVARCHAR(100) NOT NULL,
        Payload NVARCHAR(MAX) NOT NULL,
        CreatedAt DATETIME2 DEFAULT SYSUTCDATETIME()
    );
    

4. CQRS (Command‑Query Responsibility Segregation)

  • Write Model (Mô hình Ghi): Bảng chuẩn hóa kèm theo các ràng buộc (constraints), stored procedures cho quy tắc nghiệp vụ.
  • Read Model (Mô hình Đọc): Phi chuẩn hóa, sử dụng column-store (tối ưu cho mệnh đề ORDER BY) hoặc Azure Synapse cho tính toán phân tích.
  • Đồng bộ hóa: Sử dụng SQL Server Service Broker hoặc CDC + Azure Data Factory để đẩy các thay đổi từ hệ thống OLTP sang OLAP.
  • Backup: Phân tách các chính sách backup – OLTP (backup log tần suất cao) vs OLAP (full backup hàng tuần).
  • Ví dụ – Bảng Write Orders + Read view vw_OrderSummary.

5. Các mẫu Multi‑Tenant

Mẫu cài đặt (Pattern)Mức độ cách lyƯu điểmNhược điểm
Cơ sở dữ liệu riêng rẽVật lýTính bảo mật cao, dễ dàng mở rộng, backup tách biệt.Chi phí cao, quản lý được chuỗi kết nối lớn.
Chia sẻ DB, Schema tách biệtLogicChi phí vừa phải, dễ dạng truy vấn giữa các thành phần khác nhau.Đòi hỏi quản lý schema phức tạp.
Chia sẻ DB, chia sẻ bảng bằng cột phân biệt TenantIdMức dòng (Row)Chi phí tối thiểu nhất, kết cấu đơn giản.Phải định nghĩa Row-Level Security (RLS) để cô lập, cực kỳ cẩn trọng khi indexing.

Các mẹo thực hành cài đặt

  • Kích hoạt Row-Level Security nếu ứng dụng cài đặt thiết kế chia sẻ bảng shared-table:
    sql
    CREATE SECURITY POLICY TenantFilter
    ADD FILTER PREDICATE dbo.fn_TenantPredicate(TenantId) ON dbo.Orders;
    
  • Tuỳ ứng linh động cài đặt Elastic Pools cho các thiết kế tenant database nhỏ để chia sẻ nguồn cấp (resources).

6. Checklist cho Backup & Restore

  1. Full Backup – hàng tuần, gửi vào bộ lưu trữ ngoài (geo-redundant storage).
  2. Differential Backup – thực hiện song song (hàng ngày).
  3. Transaction Log Backup – mỗi 15 phút (hoặc giảm xuống 5 phút nếu RPO đòi hỏi cực căng).
  4. Test Restore – Định kỳ hàng quý (quarterly drills) thực hiện các bước point-in-time test trả file test lên một hệ thống sandbox khác.
  5. Chính sách Retention Policy – lưu log backup khoảng 30 ngày, full backup là 90 ngày. Đẩy các bản ghi cũ lên kho Archive.

7. Các định hướng Data-Lake & ETL Integrations (Tích hợp)

  • Landing Zone: Dành ra các thư mục root như folder thuộc phân vùng của Azure Data Lake Gen2. Ví dụ: raw/<source>/ -> raw/onprem_sql/.
  • Ingestion: Tiến trình lấy dữ liệu dùng ứng phó Azure Data Factory - tính năng Copy Activity qua một máy chủ local Self-hosted IR chuyên trách push pull các nguồn CDC changes.
  • Transformation (Biến đổi): Thiết đặt Synapse Spark (hay Azure Databricks) hỗ trợ việc cleansing, enrich tính toán lại model & writes chèn trả ngược ra Azure Synapse DW (hoặc SQL DW).
  • Orchestration: Mạch pipeline xử lý thuộc nền tảng ADF liên hợp bắt các schedules hay trigger thuộc luồng event grids theo mỗi tập files đổ xuống zone trên.
  • Ví dụ: Dùng kết nối incremental copy queries thông qua khoá chốt bảng Source: SELECT * FROM dbo.Customers WHERE ModifiedDate > @Watermark.

8. Case Study – Xử lý (Ingestion) khối lượng Order tăng đột ngột

  • Kịch bản: Lên chốt 200k orders mỗi giờ. Cần cài đặt bảo đạm đường truyền write-latency độ chênh mini-giây và update báo cáo analytics qua hệ thống Real-Time.
  • Thiết kế:
    1. Cấu hình Write DB – Lập Managed Instance ở phân khúc Azure SQL qua định dạng partition tách bảng Orders bảng cho từng đơn thông qua mã OrderDate.
    2. Bật cờ CDC – thiết lập cờ enabled với đối tượng bảng Orders.
    3. Giải pháp ADF – copy tiến trình cập nhật mới (CDC changes) lên thư mục của Data Lake định kỳ ngắt quãng 5 phút.
    4. Lớp Data Synapse – truy quét qua bảng Materialized view vw_OrderStats cài mặc định làm tươi cứ mỗi hút.
    5. Đăng ký Backup – Giám sát lưu bằng PITR, bổ túc chèn lệnh nighty full-backup lưu định kỳ tới phân tệp Blob.
  • Kết quả: Gần như không ghi độ trễ thiết đặt cài schema, analytic system cực nhạy phân bổ chính xác tính chốt RPO/RTO theo luật công ty.

Các tài liệu được lưu lại ở thư mục SQL Deep-Dive - chuyên trang hệ thống thông tin Wiki senior.