Giới thiệu @codemix/graph: Graph Database thời gian thực, an toàn kiểu dữ liệu và hỗ trợ CRDT

21 tháng 4, 2026·4 phút đọc

@codemix/graph là một thư viện cơ sở dữ liệu đồ thị mới kết hợp tính an toàn kiểu dữ liệu của TypeScript với khả năng đồng bộ hóa thời gian thực qua CRDT. Thư viện cung cấp API duyệt đồ thị kiểu Gremlin, hỗ trợ ngôn ngữ truy vấn Cypher và tích hợp sâu với Yjs để xây dựng các ứng dụng cộng tác offline-first.

Trong bối cảnh phát triển ứng dụng hiện đại, nhu cầu về dữ liệu có cấu trúc phức tạp và khả năng đồng bộ hóa thời gian thực ngày càng tăng. Codemix đã giới thiệu một dự án mã nguồn mở thú vị mang tên @codemix/graph — một cơ sở dữ liệu đồ thị (graph database) được thiết kế để giải quyết các thách thức này bằng cách kết hợp tính an toàn kiểu dữ liệu (type-safe) và công nghệ CRDT (Conflict-free Replicated Data Types).

Dưới đây là những điểm nổi bật của công nghệ mới này.

Định nghĩa Schema và An toàn kiểu dữ liệu

Một trong những ưu điểm lớn nhất của @codemix/graph là sự tích hợp chặt chẽ với TypeScript. Các nhà phát triển có thể định nghĩa schema cho các đỉnh (vertices), cạnh (edges) và chỉ mục (indexes) ngay trong mã nguồn.

Thư viện hỗ trợ các thư viện chuẩn để định nghĩa schema như Zod, Valibot hoặc ArkType. Điều này đảm bảo rằng mọi thuộc tính đều được kiểm tra kiểu (type-checked) tại thời điểm biên dịch và được xác thực (validate) tại thời điểm chạy. Bạn không còn phải lo lắng về các lỗi ngầm định hay việc ép kiểu (casting) thủ công khi thực hiện truy vấn hoặc thay đổi dữ liệu.

API duyệt đồ thị kiểu Gremlin

Để tương tác với dữ liệu, @codemix/graph cung cấp một API duyệt đồ thị (traversal API) theo phong cách của Gremlin. Tuy nhiên, điểm khác biệt là mọi bước đi trong truy vấn đều được TypeScript kiểm tra dựa trên schema đã định nghĩa.

Bạn có thể dễ dàng lọc theo thuộc tính, duyệt qua các cạnh, và chọn các đỉnh tại nhiều bước nhảy khác nhau. Mọi thao tác đều có gợi ý code (autocomplete) chính xác, giúp giảm thiểu lỗi sai chính tả tên thuộc tính hay nhãn (label).

Đồng bộ hóa thời gian thực với CRDT

Điểm "ăn tiền" nhất của dự án này là khả năng chuyển đổi sang chế độ lưu trữ phân tán chỉ bằng một dòng code. Bằng cách thay thế InMemoryGraphStorage bằng YGraph từ gói @codemix/y-graph-storage, toàn bộ đồ thị của bạn sẽ sống trong một tài liệu CRDT của Yjs.

Điều này cho phép:

  • Offline-first: Ứng dụng vẫn hoạt động khi mất mạng.
  • Real-time collaboration: Nhiều người dùng có thể chỉnh sửa dữ liệu đồng thời trên các tab hoặc thiết bị khác nhau mà không bị xung đột.
  • Fine-grained updates: Bạn có thể đăng ký theo dõi các thay đổi chi tiết (ví dụ: một thuộc tính cụ thể bị thay đổi) để cập nhật giao diện người dùng (UI) tức thì.

Thư viện cũng hỗ trợ các loại dữ liệu cộng tác đặc thù như Y.Text (cho văn bản) và Y.Array (cho danh sách), cho phép nhiều người cùng chỉnh sửa một chuỗi hoặc mảng dữ liệu một cách mượt mà.

Hỗ trợ ngôn ngữ truy vấn Cypher

Ngoài API lập trình, @codemix/graph còn cung cấp khả năng truy vấn thông qua ngôn ngữ Cypher (tương tự Neo4j). Tính năng này cực kỳ hữu ích cho việc:

  • Tích hợp với các Mô hình ngôn ngữ lớn (LLM) thông qua MCP servers.
  • Cho phép người dùng hoặc client bên ngoài thực hiện các truy vấn ad-hoc mà không cần bundle toàn bộ thư viện duyệt đồ thị.

Thư viện hỗ trợ đầy đủ các câu lệnh MATCH, WHERE, RETURN, ORDER BY, LIMIT và cả các thao tác ghi như CREATE, MERGE, SET, DELETE. Bạn cũng có thể sử dụng tham số hóa (parameterised queries) để tránh các lỗ hổng bảo mật khi chèn chuỗi.

Kết luận

Hiện tại, @codemix/graph đang ở phiên bản alpha. Mặc dù đội ngũ phát triển tại Codemix đang sử dụng nó trong môi trường sản xuất và hoạt động ổn định cho các use case của họ, họ cũng khuyến cáo người dùng nên thận trọng khi áp dụng cho dữ liệu quan trọng của mình.

Với giấy phép MIT, đây là một công cụ đầy hứa hẹn cho các lập trình viên đang tìm kiếm giải pháp quản lý dữ liệu đồ thị phức tạp kết hợp với khả năng cộng tác thời gian thực trên nền tảng web.

Bài viết được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗