Database cho e-commerce: chọn cơ sở dữ liệu phù hợp cho catalog hàng triệu sản phẩm

Database cho E-commerce: Chọn cơ sở dữ liệu phù hợp cho Catalog triệu sản phẩm

Không có một cơ sở dữ liệu duy nhất phù hợp cho mọi việc của một website TMĐT có catalog lớn. Cách làm phổ biến và bền vững là dùng database quan hệ (MySQL hoặc PostgreSQL) làm nguồn dữ liệu chính cho sản phẩm, đơn hàng và tồn kho; thêm bộ nhớ đệm như Redis cho dữ liệu đọc nhiều; và dùng công cụ tìm kiếm như Elasticsearch hoặc OpenSearch cho tìm kiếm và lọc sản phẩm.

Bài viết so sánh các lựa chọn database phổ biến, đưa ra kiến trúc dữ liệu tham chiếu và cách thiết kế catalog hàng triệu sản phẩm vẫn truy vấn nhanh.

Tóm tắt nhanh

  • Đơn hàng, thanh toán, tồn kho cần tính toàn vẹn giao dịch: dùng database quan hệ.
  • PostgreSQL mạnh về dữ liệu thuộc tính linh hoạt (JSONB); MySQL phổ biến nhất với WooCommerce, Magento và có hệ sinh thái lớn.
  • Website TMĐT đọc nhiều hơn ghi rất nhiều: read replica và bộ nhớ đệm cho hiệu quả lớn nhất.
  • Tìm kiếm và lọc sản phẩm ở quy mô lớn nên chuyển sang công cụ tìm kiếm chuyên dụng.

Dữ liệu thương mại điện tử có gì đặc biệt?

Dữ liệu TMĐT có 4 đặc điểm quyết định cách chọn database:

  1. Đọc nhiều hơn ghi rất nhiều. Mỗi đơn hàng thường đi kèm hàng chục đến hàng trăm lượt xem trang sản phẩm, danh mục và tìm kiếm.
  2. Thuộc tính sản phẩm biến đổi theo danh mục. Áo có size, màu, chất liệu; điện thoại có RAM, bộ nhớ, màn hình. Một cấu trúc bảng cố định khó đáp ứng.
  3. Giao dịch cần chính xác tuyệt đối. Đơn hàng, thanh toán, trừ kho phải tuân thủ tính toàn vẹn (ACID): không được mất đơn hay trừ kho hai lần.
  4. Tải tăng vọt theo chiến dịch. Giờ mở flash sale, số truy vấn có thể gấp nhiều lần ngày thường trong vài phút.

MySQL, PostgreSQL hay NoSQL cho e-commerce?

Với phần lớn hệ thống TMĐT, MySQL và PostgreSQL đều là lựa chọn tốt làm database chính. NoSQL phù hợp cho một số phần dữ liệu cụ thể, hiếm khi thay thế hoàn toàn database quan hệ.

Tiêu chí MySQL PostgreSQL NoSQL tài liệu (ví dụ MongoDB)
Giao dịch, tính toàn vẹn Tốt (InnoDB) Rất tốt Có hỗ trợ giao dịch, nhưng mô hình dữ liệu khác
Thuộc tính sản phẩm linh hoạt Kiểu JSON, cần cột sinh để đánh chỉ mục JSONB có chỉ mục GIN, truy vấn linh hoạt Rất linh hoạt, schema tự do
Truy vấn phức tạp, báo cáo Tốt Rất tốt (CTE, window function, nhiều loại chỉ mục) Hạn chế hơn với truy vấn liên kết nhiều bảng
Nền tảng TMĐT phổ biến WooCommerce, Magento, PrestaShop dùng mặc định Nhiều hệ thống tự phát triển, một số framework hiện đại Ít nền tảng TMĐT dùng làm database chính
Phù hợp nhất cho Website dùng nền tảng có sẵn, đội ngũ quen MySQL Hệ thống tự phát triển, catalog nhiều thuộc tính, báo cáo phức tạp Nhật ký hoạt động, nội dung phi cấu trúc, hồ sơ người dùng linh hoạt

Kết luận thực tế: nếu dùng WooCommerce hay Magento, hãy dùng MySQL. Nếu tự xây hệ thống với catalog nhiều thuộc tính, PostgreSQL thường là lựa chọn mạnh hơn. Sun Database hỗ trợ cả MySQL và PostgreSQL dưới dạng dịch vụ được quản lý.

Kiến trúc dữ liệu nhiều lớp cho website TMĐT

Mỗi loại truy vấn được phục vụ bởi công cụ phù hợp nhất, trong đó database quan hệ luôn là nguồn sự thật.

[ẢNH 1 — Kiến trúc dữ liệu nhiều lớp cho TMĐT]

Lớp Công cụ Dữ liệu và truy vấn
Nguồn sự thật MySQL / PostgreSQL (Sun Database) Sản phẩm, biến thể, giá, tồn kho, đơn hàng, khách hàng
Bản sao đọc Read replica của Sun Database Trang sản phẩm, danh mục, báo cáo — không ghi
Bộ nhớ đệm Redis Phiên đăng nhập, giỏ hàng, trang sản phẩm hot, bộ đếm flash sale
Tìm kiếm Elasticsearch / OpenSearch Tìm kiếm toàn văn, lọc theo thuộc tính, gợi ý từ khóa
Luồng sự kiện Sun Kafka Highway Đồng bộ thay đổi từ database sang chỉ mục tìm kiếm, bộ nhớ đệm
Lưu trữ file Sun S3 Ảnh, video sản phẩm — không lưu file trong database

Nguyên tắc quan trọng: không lưu ảnh trong database, và không để trang tìm kiếm dùng câu lệnh LIKE '%từ khóa%' trên bảng hàng triệu dòng.

Thiết kế catalog hàng triệu sản phẩm

Catalog lớn chạy nhanh hay chậm phụ thuộc chủ yếu vào cách tổ chức bảng và chỉ mục, không phải vào cấu hình máy chủ.

Tách sản phẩm và biến thể

Một sản phẩm (áo thun cổ tròn) có nhiều biến thể (SKU) theo size và màu. Giá và tồn kho gắn với biến thể, còn mô tả và ảnh gắn với sản phẩm. Tách hai bảng giúp tránh lặp dữ liệu và cập nhật tồn kho nhanh hơn.

Lưu thuộc tính linh hoạt bằng JSONB thay vì EAV

Mô hình EAV (mỗi thuộc tính là một dòng) linh hoạt nhưng khiến truy vấn lọc rất chậm khi catalog lớn. Với PostgreSQL, lưu thuộc tính trong cột JSONB có chỉ mục GIN là cách cân bằng tốt:

CREATE TABLE products (
  id           BIGSERIAL PRIMARY KEY,
  category_id  INT          NOT NULL,
  name         TEXT         NOT NULL,
  brand        TEXT,
  attributes   JSONB        NOT NULL DEFAULT '{}',  -- {"chat_lieu": "cotton", "xuat_xu": "VN"}
  status       SMALLINT     NOT NULL DEFAULT 1,
  updated_at   TIMESTAMPTZ  NOT NULL DEFAULT now()
);

CREATE TABLE variants (
  sku          VARCHAR(64)  PRIMARY KEY,
  product_id   BIGINT       NOT NULL REFERENCES products(id),
  options      JSONB        NOT NULL,                -- {"size": "M", "mau": "trang"}
  price        NUMERIC(12,0) NOT NULL,              -- VNĐ
  stock        INT          NOT NULL DEFAULT 0
);

CREATE INDEX idx_products_category ON products (category_id, status, updated_at DESC);
CREATE INDEX idx_products_attrs    ON products USING GIN (attributes);
CREATE INDEX idx_variants_product  ON variants (product_id);

Phân trang bằng keyset thay vì OFFSET

Trang danh mục dùng OFFSET 100000 sẽ chậm dần khi người dùng (hoặc bot) lật sâu, vì database phải đọc và bỏ qua toàn bộ dòng phía trước. Phân trang keyset dùng giá trị của dòng cuối trang trước làm mốc (WHERE updated_at < :moc ORDER BY updated_at DESC LIMIT 40), giữ tốc độ ổn định ở mọi trang.

Read replica: tách đọc và ghi cho tải đọc lớn

Read replica là bản sao chỉ đọc của database chính, được đồng bộ liên tục. Ứng dụng gửi truy vấn ghi (đặt hàng, trừ kho) tới database chính và gửi truy vấn đọc (xem sản phẩm, danh mục, báo cáo) tới các bản sao.

[ẢNH 2 — Database chính và các read replica]

Lưu ý quan trọng: bản sao có độ trễ đồng bộ, thường dưới một giây nhưng có thể tăng khi tải cao. Vì vậy các truy vấn cần dữ liệu mới nhất — kiểm tra tồn kho lúc thanh toán, xem đơn vừa đặt — phải đọc từ database chính. Chỉ chuyển sang bản sao những truy vấn chấp nhận được dữ liệu trễ vài giây.

7 cách tối ưu database cho website TMĐT

  1. Bật slow query log và xử lý 10 truy vấn chậm nhất mỗi tháng — thường giải quyết phần lớn vấn đề hiệu năng.
  2. Đánh chỉ mục theo cách truy vấn thật, đặc biệt chỉ mục ghép cho bộ lọc danh mục + trạng thái + sắp xếp.
  3. Dùng connection pooling để hàng trăm tiến trình ứng dụng không mở hàng trăm kết nối tới database.
  4. Đưa dữ liệu đọc nhiều vào Redis (trang sản phẩm hot, cây danh mục) với thời gian hết hạn ngắn.
  5. Chuyển tìm kiếm và lọc nhiều thuộc tính sang Elasticsearch hoặc OpenSearch khi catalog vượt vài trăm nghìn sản phẩm.
  6. Chia bảng lớn theo thời gian (partition) cho bảng đơn hàng, nhật ký: truy vấn gần đây nhanh hơn, dữ liệu cũ dễ lưu trữ.
  7. Lưu trữ đơn hàng cũ sang bảng hoặc kho riêng sau 12–24 tháng để bảng hoạt động luôn gọn.

Với hệ thống tách thành nhiều dịch vụ, mỗi dịch vụ nên sở hữu database riêng — xem kiến trúc microservices cho sàn TMĐT. Ví dụ thiết kế bảng tồn kho chống bán vượt có trong bài cloud cho seller Lazada.

Managed database là gì và vì sao nên dùng?

Managed database là cơ sở dữ liệu do nhà cung cấp cloud vận hành: cài đặt, sao lưu tự động, vá lỗi bảo mật, theo dõi và tạo bản sao đọc. Doanh nghiệp chỉ cần quản lý dữ liệu và truy vấn.

Việc cần làm Tự cài database trên máy chủ Managed database (Sun Database)
Cài đặt, cấu hình ban đầu Tự làm Khởi tạo trong vài phút
Sao lưu, khôi phục theo thời điểm Tự viết kịch bản, tự kiểm tra Tự động
Vá lỗi, nâng phiên bản Tự làm, dễ trì hoãn Nhà cung cấp hỗ trợ
Tạo read replica Cấu hình replication thủ công Vài thao tác
Giám sát Tự dựng công cụ Có sẵn chỉ số và cảnh báo

Với đội kỹ thuật nhỏ, managed database giúp giảm đáng kể rủi ro mất dữ liệu và thời gian vận hành. Hướng dẫn khởi tạo có tại tài liệu Sun Database; đơn giá tại Bảng giá dịch vụ cloud Sunteco. Quay lại hướng dẫn giải pháp cloud thương mại điện tử để xem bức tranh tổng thể.

Câu hỏi thường gặp về database cho e-commerce

Nên dùng MySQL hay PostgreSQL cho TMĐT?

Nếu dùng nền tảng có sẵn như WooCommerce, Magento, hãy dùng MySQL vì đây là lựa chọn mặc định. Nếu tự xây hệ thống với catalog nhiều thuộc tính và báo cáo phức tạp, PostgreSQL thường mạnh hơn nhờ JSONB và khả năng truy vấn nâng cao.

Database nào xử lý được catalog hàng triệu sản phẩm?

Cả MySQL và PostgreSQL đều xử lý tốt hàng triệu sản phẩm nếu thiết kế bảng và chỉ mục đúng, dùng read replica cho tải đọc và chuyển tìm kiếm sang công cụ chuyên dụng như Elasticsearch hoặc OpenSearch.

Managed database là gì?

Managed database là cơ sở dữ liệu do nhà cung cấp cloud vận hành: tự sao lưu, vá lỗi, theo dõi và hỗ trợ tạo bản sao đọc. Doanh nghiệp chỉ cần tập trung vào dữ liệu và ứng dụng thay vì quản trị máy chủ database.

Website TMĐT có cần NoSQL không?

Phần lớn không cần NoSQL làm database chính. NoSQL hữu ích cho một số phần như nhật ký hoạt động, hồ sơ người dùng linh hoạt; còn đơn hàng, thanh toán, tồn kho nên ở database quan hệ để đảm bảo tính toàn vẹn.

Read replica là gì?

Read replica là bản sao chỉ đọc của database chính, đồng bộ liên tục. Nó gánh các truy vấn đọc như xem sản phẩm, danh mục, báo cáo, giúp database chính dành tài nguyên cho đặt hàng và trừ kho.

Khởi tạo Sun Database cho hệ thống bán hàng

Sun Database là MySQL/PostgreSQL được quản lý, sao lưu tự động, hỗ trợ read replica, đặt tại Việt Nam và tính giá VNĐ.

 

 

Bạn cần chuyên gia tư vấn giải pháp Cloud phù hợp?

Vui lòng để lại thông tin, chúng tôi sẽ liên hệ với bạn trong thời gian sớm nhất!