SQL không sai, nhưng có thể không còn phù hợp với mọi hệ thống hiện đại

SQL không sai, nhưng có thể không còn phù hợp với mọi hệ thống hiện đại

Tác giả: FPT Cloud
10:07 08/04/2026
What is SQL scaled 1

Trước khi đi vào vấn đề, cần làm rõ một điều: relational database và SQL không phải công nghệ lỗi thời.

  • Relational Database (Cơ sở dữ liệu quan hệ) là một mô hình lưu trữ dữ liệu dưới dạng các bảng (tables) gồm các hàng và cột - rất giống với cách chúng ta nhìn một file Excel. Điểm đặc biệt là các bảng này không đứng độc lập mà có mối quan hệ (relationship) chặt chẽ với nhau thông qua các trường dữ liệu chung.
  • SQL (Structured Query Language) chính là ngôn ngữ tiêu chuẩn dùng để "nói chuyện", truy vấn và thao tác với các cơ sở dữ liệu quan hệ này.

Sự kết hợp này tạo nên một hệ thống cực kỳ chặt chẽ, hoạt động dựa trên bộ quy tắc bất di bất dịch mang tên ACID (đặc biệt là tính Atomicity - Nguyên tố và Isolation - Độc lập).

Các quy tắc này đảm bảo rằng: hoặc là giao dịch của bạn thành công trọn vẹn hoặc là thất bại và hệ thống quay về trạng thái ban đầu chứ không bao giờ có chuyện lấp lửng hay sai lệch dữ liệu.

Chính nhờ nền tảng vững chắc đó, phần mềm kế toán doanh nghiệp, hệ thống ngân hàng lõi, nền tảng quản lý giao dịch tài chính vẫn đang chạy ổn định.

Vậy tại sao ngày càng nhiều engineering team đang gặp vấn đề với relational database khi hệ thống scale?

Relational database được thiết kế khi hệ thống phần mềm điển hình có kiến trúc khá đơn giản: một ứng dụng trung tâm, một database, lượng truy cập ổn định và dự đoán được.

Tuy nhiên, lấy ví dụ một nền tảng e-commerce trung bình ở Việt Nam giờ có thể gồm hàng chục ứng dụng vận hành độc lập, quản lý đơn hàng, thanh toán, kho hàng, gợi ý sản phẩm, thông báo đẩy, điểm thưởng và mỗi ứng dụng do một nhóm khác nhau phát triển. Đi kèm đó là lượng truy cập không còn ổn định. Một chiến dịch khuyến mãi có thể đẩy số lượng yêu cầu lên hàng chục lần chỉ trong vài phút.

Thêm một điểm khác biệt so với hiện nay là yêu cầu về dữ liệu thay đổi liên tục. Nhóm sản phẩm cần thêm thuộc tính mới cho từng danh mục hàng hóa. Nhóm thiết kế cần ghi lại thêm hành vi người dùng. Nhóm phân tích cần dữ liệu theo thời gian thực.

Khi đặt relational database vào bối cảnh này, ba điểm lệch pha bắt đầu bộc lộ.

Ba điểm lệch pha giữa SQL và hệ thống hiện đại

1. Một database phục vụ quá nhiều ứng dụng - điểm nghẽn không ai tính đến

Hãy hình dung thế này: một nhà bếp trung tâm phục vụ mười quầy bán hàng cùng lúc. Khi tất cả đều đặt đơn vào giờ cao điểm, vấn đề không phải là thiếu nguyên liệu mà là nhà bếp không thể xử lý tất cả cùng một lúc.

Theo đó, nếu trong trường hợp nhiều bộ phận phần mềm dùng chung một relational database, kịch bản tương tự xảy ra. Khi một bộ phận chạy tác vụ nặng, ví dụ xuất báo cáo, gửi thông báo hàng loạt, nó chiếm dụng tài nguyên của hiệu năng của Database chung, kéo chậm tất cả các bộ phận còn lại dù chúng hoàn toàn không liên quan.

Đây là vấn đề của kiến trúc thiết kế database, không phải vấn đề tối ưu. Viết lại câu truy vấn hay thêm chỉ mục tìm kiếm không giải quyết được khi nguyên nhân gốc rễ là tất cả đều đang tranh nhau một kho dữ liệu duy nhất.

Câu chuyện thực tế: Một startup fintech tại Đông Nam Á từng gặp chính xác tình huống này. Khi hệ thống bắt đầu gửi thông báo đẩy hàng loạt vào buổi sáng - thời điểm người dùng hoạt động nhiều nhất, tốc độ xử lý giao dịch của toàn bộ hệ thống giảm đáng kể.

Sau nhiều tuần tìm nguyên nhân, đội kỹ thuật nhận ra rằng bộ phận gửi thông báo và bộ phận xử lý thanh toán đang tranh nhau tài nguyên trên cùng một kho dữ liệu. Giải pháp cuối cùng không phải là tối ưu code mà là tách dữ liệu của hai bộ phận ra khỏi nhau.

pitr mysql 1

2. Dữ liệu bị phân tán ở nhiều nơi và hợp nhất là điều không đơn giản

Relational database có khả năng kết hợp dữ liệu từ nhiều bảng trong một câu truy vấn duy nhất. Đây là một trong những điểm mạnh nhất khiến nó phù hợp với báo cáo và phân tích phức tạp.

Nhưng trong hệ thống hiện đại, mỗi bộ phận phần mềm thường quản lý dữ liệu riêng của mình. Thông tin đơn hàng ở một nơi, thông tin khách hàng ở một nơi khác, thông tin sản phẩm ở nơi khác nữa.

Khi đó, việc tổng hợp dữ liệu từ nhiều nguồn không còn là một câu truy vấn đơn giản nữa. Nó trở thành một chuỗi các bước gọi qua lại giữa các bộ phận, tổng hợp kết quả ở tầng ứng dụng, và xử lý nhiều tình huống lỗi có thể xảy ra ở từng bước.

Thao tác trước đây mất vài phần nghìn giây giờ có thể mất vài trăm lần lâu hơn và có thể gặp sự cố ở nhiều điểm khác nhau trong chuỗi xử lý.

3. Cấu trúc dữ liệu cứng nhắc - khi database chậm hơn nhịp độ kinh doanh

Relational database được thiết kế với cấu trúc dữ liệu chặt chẽ: mỗi bảng có các cột xác định sẵn, mỗi cột có kiểu dữ liệu cố định. Tính chặt chẽ này là lợi thế khi dữ liệu ổn định và ít thay đổi. Nhưng nó trở thành rào cản khi sản phẩm cần thay đổi nhanh.

Thêm một trường thông tin mới vào bảng dữ liệu đang có hàng chục triệu bản ghi trên hệ thống đang chạy thực tế không phải thao tác đơn giản. Tùy vào cách hệ thống được cấu hình, thao tác này có thể khóa bảng dữ liệu đó trong vài phút đến vài giờ đồng nghĩa với việc hệ thống gián đoạn.

Ngay cả khi có công cụ hỗ trợ, quy trình vẫn đòi hỏi: viết kịch bản chuyển đổi dữ liệu, kiểm tra trên môi trường thử nghiệm, phối hợp giữa nhiều nhóm, và triển khai theo từng bước để tránh sự cố.

Kết quả thực tế: những thay đổi nhỏ trong cách lưu trữ dữ liệu thêm một thuộc tính sản phẩm, ghi nhận thêm một loại hành vi người dùng, thay đổi cách tổ chức thông tin khuyến mãi tốn nhiều ngày công sức của đội kỹ thuật mà không trực tiếp tạo ra giá trị cho người dùng.

Nhân con số đó với tần suất thay đổi trong một quý, và ta thấy cấu trúc dữ liệu cứng nhắc đang âm thầm làm chậm tốc độ phát triển sản phẩm theo cách khó đo lường nhưng rất thực tế.

SQL vẫn là lựa chọn đúng, cho đúng bài toán

Ba vấn đề trên không phải lý do để từ bỏ relational database. Đây là lý do để hiểu rõ hơn khi nào nó là lựa chọn tốt nhất.

Vấn đề nảy sinh khi áp dụng relational database cho những bài toán khác với bản chất thiết kế của nó: dữ liệu sản phẩm cần thay đổi cấu trúc thường xuyên, thông tin người dùng với nhiều thuộc tính lồng nhau, luồng sự kiện từ hàng triệu người dùng, hay nội dung số với định dạng đa dạng.

Khi hệ thống bắt đầu mở rộng, câu hỏi không còn là "SQL hay NoSQL?" mà nên là:

Dữ liệu của ứng dụng/dịch vụ này cần được tổ chức như thế nào để có thể mở rộng độc lập, thay đổi cấu trúc mà không gây các tác động đến kết nối và sự liền mạch, và phục vụ đúng các yêu cầu truy cập của nó?

Với một số hệ thống, câu trả lời vẫn là relational database. Với một số hệ thống khác, đặc biệt là những nơi dữ liệu thay đổi cấu trúc thường xuyên hoặc cần mở rộng linh hoạt theo chiều ngang - câu trả lời dần hướng về phía các mô hình database khác.

Document database là một trong những mô hình được nhiều hệ thống lớn lựa chọn cho nhóm bài toán thứ hai. Trong bài tiếp theo, chúng ta sẽ đi vào câu hỏi thực tế nhất: relational database và document database khác nhau ở đâu — và khi nào nên chọn loại nào cho từng phần của hệ thống?

Liên hệ với chúng tôi để được tư vấn chi tiết về các giải pháp, dịch vụ của FPT Cloud: