Tại sao SurrealDB là Cơ sở Dữ liệu Duy nhất Bạn Cần cho Dự án Tiếp theo

Database tutorial - IT technology blog
Database tutorial - IT technology blog

Sự chuyển dịch sang Đa mô hình (Multi-Model)

Việc quản lý dữ liệu trước đây đồng nghĩa với việc bạn phải chọn một phe. Nếu bạn cần các bảng có cấu trúc, bạn chọn SQL. Nếu cần sự linh hoạt, bạn chọn NoSQL.

Đối với các mối quan hệ phức tạp, bạn tìm đến cơ sở dữ liệu Graph. Sau nhiều năm xoay xở với PostgreSQL và MySQL và MongoDB, tôi nhận ra rằng việc duy trì ba chuỗi kết nối (connection strings) và các script đồng bộ riêng biệt là công thức dẫn đến sự kiệt sức. Trong một dự án, chúng tôi đã dành 20% thời gian sprint chỉ để đảm bảo dữ liệu quan hệ khớp với document store. Tôi muốn một công cụ có thể xử lý mọi mô hình (pattern) mà không tốn chi phí quản lý hạ tầng.

SurrealDB giải quyết vấn đề này bằng cách hoạt động như một document, graph và relational database trong một file binary duy nhất. Nó làm được nhiều hơn là chỉ lưu trữ dữ liệu; nó tự xử lý lớp API và xác thực (authentication). Đối với những lập trình viên đã chán ngấy việc viết đi viết lại logic CRUD mẫu, nó giúp đơn giản hóa toàn bộ backend stack.

Bắt đầu nhanh: Chạy ngay trong 60 giây

Bạn có thể chạy SurrealDB trên máy cục bộ chỉ với một câu lệnh duy nhất. Dù bạn dùng macOS, Linux hay Windows qua WSL, script này sẽ quản lý việc cài đặt cho bạn.

curl --proto '=https' --tlsv1.2 -sSf https://install.surrealdb.com | sh

Khởi động một cơ sở dữ liệu tạm thời trong bộ nhớ hệ thống. Đây là cách nhanh nhất để kiểm tra các truy vấn mà không làm đầy ổ cứng bằng các file dữ liệu lâu dài.

surreal start --log debug --user root --pass root memory

Mở một tab terminal mới. Sử dụng SQL shell tích hợp sẵn để tương tác với server của bạn ngay lập tức:

surreal sql --endpoint http://localhost:8000 --namespace test --database test --auth-user root --auth-pass root

Việc tạo bản ghi đầu tiên rất đơn giản. Trong SurrealDB, mỗi bản ghi được xác định bằng một định danh table:id duy nhất.

CREATE person:john SET 
    name = 'Nguyễn Văn A', 
    email = '[email protected]', 
    created_at = time::now();

Truy xuất dữ liệu đó bằng cú pháp SQL mà bạn đã quen thuộc:

SELECT * FROM person:john;

Tìm hiểu sâu: Tại sao Đa mô hình lại quan trọng

SurrealDB không chỉ là một bản sao NoSQL khác. Nó sử dụng SurrealQL, một ngôn ngữ mang lại cảm giác giống SQL nhưng sở hữu những khả năng mà các cơ sở dữ liệu quan hệ truyền thống còn thiếu.

1. Schemafull hoặc Schemaless

Trong MongoDB, bạn có thể lưu trữ bất kỳ cấu trúc JSON nào, điều này thường dẫn đến dữ liệu lộn xộn. Trong PostgreSQL, bạn phải định nghĩa trước mọi cột. SurrealDB cung cấp những gì tốt nhất của cả hai thế giới. Bạn có thể xây dựng prototype với phương pháp schemaless và sau đó khóa các bảng bằng DEFINE TABLEDEFINE FIELD khi các yêu cầu đã ổn định.

2. Record ID đóng vai trò như Con trỏ trực tiếp

Các cơ sở dữ liệu tiêu chuẩn coi ID là các chuỗi hoặc số nguyên đơn giản. SurrealDB coi chúng là các con trỏ (pointers). Khi bạn lưu trữ person:john, hệ thống biết chính xác vị trí vật lý của bản ghi đó. Điều này cho phép tra cứu với độ phức tạp O(1). Nó bỏ qua việc quét index truyền thống vốn làm chậm các cơ sở dữ liệu quan hệ khi chúng phát triển lên đến hàng triệu hàng.

3. Quan hệ Graph không tốn chi phí JOIN

JOIN là nút thắt cổ chai chính trong các hệ thống quan hệ. Thay vào đó, SurrealDB sử dụng các cạnh (edges) trong graph để liên kết dữ liệu. Hãy tưởng tượng một ứng dụng mạng xã hội nơi người dùng thích một bài đăng. Bạn không cần một bảng trung gian; bạn chỉ cần “liên kết” (relate) chúng.

RELATE person:john->like->post:123 
    SET time = time::now();

Để tìm tất cả những người đã thích một bài đăng cụ thể, bạn chỉ cần đi theo mũi tên. Nó nhanh, dễ đọc và có khả năng mở rộng theo chiều ngang:

SELECT ->like->person.name FROM post:123;

Sử dụng nâng cao: Real-time và Bảo mật

SurrealDB xử lý các tính năng thường yêu cầu các dịch vụ backend bổ sung như Redis hoặc các nhà cung cấp Auth chuyên dụng.

Live Queries (Truy vấn trực tiếp)

Các ứng dụng hiện đại đòi hỏi tính tương tác thời gian thực. Thay vì phải cấu hình WebSockets thủ công, bạn có thể đăng ký nhận thay đổi dữ liệu trực tiếp. Sử dụng LIVE SELECT để nhận thông báo ngay khi một bản ghi được cập nhật.

LIVE SELECT * FROM person WHERE city = 'Hà Nội';

Bất cứ khi nào một người dùng ở Hà Nội được thêm vào hoặc cập nhật, frontend của bạn sẽ nhận được thay đổi ngay lập tức.

Xác thực tích hợp (Embedded Authentication)

Tính năng ấn tượng nhất là khả năng xử lý người dùng ứng dụng ngay bên trong cơ sở dữ liệu. Bạn có thể định nghĩa các scope và quyền hạn để frontend giao tiếp trực tiếp với SurrealDB. Điều này loại bỏ nhu cầu về một middleware API truyền thống cho nhiều tác vụ.

DEFINE TABLE post SCHEMAFULL
    PERMISSIONS
        FOR select WHERE published = true OR author = $auth.id;

Cơ sở dữ liệu sẽ thực thi các quy tắc này. Bất kể người dùng cố gắng truy cập dữ liệu bằng cách nào, họ chỉ có thể thấy những gì bạn cho phép.

Mẹo thực tế khi triển khai

Việc học một công cụ mới sẽ dễ dàng hơn khi bạn tránh được các sai lầm phổ biến. Dưới đây là bốn mẹo từ chính các dự án thực tế của tôi:

  • Tận dụng Docker: Docker image chính thức là cách đáng tin cậy nhất để quản lý môi trường giữa các thành viên trong nhóm và các pipeline CI/CD.
  • Cấu trúc Namespace của bạn: Sử dụng một Namespace cho dự án (ví dụ: acme_corp) và các Database riêng biệt cho các môi trường như devprod.
  • Sử dụng ID tự nhiên (Natural ID): Tránh sử dụng các UUID ngẫu nhiên khi đã có sẵn một định danh duy nhất. Nếu bạn đang lập danh mục sách, book:9780132350884 sẽ hữu ích hơn nhiều cho việc debug so với một chuỗi ngẫu nhiên.
  • Debug với Trace: Nếu một truy vấn thất bại do các quyền phức tạp, hãy chạy server với --log trace. Nó sẽ tiết lộ chính xác bước kiểm tra quyền nào đang chặn yêu cầu.

SurrealDB loại bỏ rào cản giữa các mô hình dữ liệu khác nhau. Bạn có thể mở rộng từ một document store đơn giản thành một mạng lưới graph khổng lồ mà không cần di chuyển dữ liệu sang một nhà cung cấp mới. Một khi bạn chạy câu lệnh RELATE đầu tiên, hiệu quả của phương pháp đa mô hình sẽ trở nên không thể phủ nhận.

Share: