59 điểm bởi xguru 2022-07-27 | 10 bình luận | Chia sẻ qua WhatsApp
  • Đã dùng khoảng 1 năm và đã chuyển mọi dự án có thể sang EdgeDB
  • EdgeDB là một Graph/Relational DB được xây dựng trên Postgres
    → Vẫn dùng nguyên engine cũ, nhưng từ góc nhìn người dùng thì mọi thứ đã thay đổi. Thay đổi lớn nhất là ngôn ngữ truy vấn và bộ công cụ (tooling)

Ngôn ngữ truy vấn

  • EdgeDB không có SQL mà dùng ngôn ngữ riêng là EdgeQL, và đây chính là game changer
  • Sau khi dùng thử, tôi không còn muốn quay lại SQL nữa
    → Kiểu dữ liệu mạnh, hướng đối tượng, deep query cực kỳ dễ, và ánh xạ rất tốt với cách con người nghĩ về việc truy vấn dữ liệu (vì con người đâu có suy nghĩ theo kiểu JOIN)
  • Trước đây tôi vốn cũng không phải fan của SQL, nhưng thực tế là không có lựa chọn thay thế
  • Sau vài ngày học và thực hành cùng bộ tutorial kiểu sách cực kỳ tuyệt vời, tôi nhận ra việc mô hình hóa schema DB có thể là một công việc thú vị và nhẹ nhàng
    → Sự phức tạp của SQL biến mất, và tôi nhận ra SQL vừa kém hiệu quả vừa kỳ quặc ra sao khi là một ngôn ngữ truy vấn
  • EdgeQL rất dễ học, chỉ với quickstart và overview là có thể nắm được khoảng 80%
  • Tôi thích EdgeQL đến mức mong nó trở thành một tiêu chuẩn độc lập. Ví dụ sẽ rất hay nếu có thứ như EdgeDBLite cho phép dùng EdgeQL với file-based DB

Tooling

  • Theo mô hình hiện đại là chỉ cần một binary để chạy mọi thứ (giống Go hay Flutter)
    → Cài đặt và cập nhật server, tạo/xóa DB, REPL, migration, backup và quản lý project, v.v.
    → Và trong hầu hết trường hợp, "It Just Works"
  • EdgeDB đã tái phát minh cách tương tác với DB
    → Với khái niệm "Project", nó tự động kết nối với DB nên cứ thế hoạt động, không cần bận tâm đến DSN hay cấu hình
    → So với cảnh hơn 10 năm đi tìm đúng câu lệnh SQL để cấp quyền root access trên localhost, cảm giác này thật sự rất sảng khoái

Tính năng

  • Mô hình hóa quan hệ many-to-many cực kỳ dễ
  • GraphQL nhúng (có thể kết nối trực tiếp từ frontend)
  • Thuộc tính computed rating := math::mean(.ratings.score)
  • backlinks: lần ngược theo liên kết
    select User.<author; tìm trong bảng được liên kết tới User bằng trường tên là author
  • uuid, collection, scalar, abstract và nhiều kiểu khác (mục ưa thích của tôi là cal::local_datetime)
  • inheritance, constraints và cả những thứ đáng sợ như Introspection

Trải nghiệm đến hiện tại

  • Tôi bắt đầu dùng từ khoảng 1 năm trước. Ban đầu là chuyển một dự án cá nhân nhỏ, sau đó là một trong các dự án ở công ty
  • Phần lớn công việc của tôi là các dịch vụ thực dụng quy mô nhỏ phục vụ người dùng, nên đôi khi tôi có sự xa xỉ là tự mình phụ trách và chọn công cụ phù hợp nhất
  • Trong thời gian dùng EdgeDB, phần lớn trải nghiệm đều là kiểu "It Just Works"
  • Hầu hết mọi thứ đều dễ tìm, và tài liệu thì xuất sắc nên tra cứu rất dễ (thật sự là một trong những trang tài liệu tốt nhất tôi từng thấy)

Có phù hợp cho production không

  • Từ mùa thu năm ngoái tôi đã "dùng trong production"
  • Một số người gán nhiều ý nghĩa hơn cho việc "dùng trong production" so với chỉ đơn giản là "thực sự đang dùng", nhưng...
  • Khi công cụ dòng lệnh được refactor, tôi có phải chỉnh nhẹ vài script tự động hóa, nhưng không phải chuyện lớn
  • Trong đầu tôi vốn đã chuẩn bị tinh thần trả giá cho rủi ro của một early adopter, nhưng đến giờ thì vẫn chưa có vấn đề gì

Độ biểu đạt của EdgeQL

  • Cuối cùng tôi cũng được giải thoát khỏi cảnh lên Google tra SQL và tìm cách né các giới hạn của ORM
  • EdgeQL cho phép tôi diễn đạt chính xác những gì mình muốn lấy từ DB, và thực sự có thể đọc hiểu được (cả các lập trình viên khác cũng vậy)
  • Nhiều khi EdgeQL còn giúp tránh phải dùng transaction. Có thể thực hiện nhiều cập nhật lồng nhau trong một truy vấn duy nhất.
    → "Simplicity is complicated"

Migrations

  • Một trong những điểm tuyệt nhất là tính năng migration được tích hợp sẵn
  • Chỉ cần thay đổi schema rồi gọi edgedb migration create là file migration được tạo ra,
    trên server chỉ cần edgedb migration apply là áp dụng ngay
  • Các migration được nối với nhau bằng hash, nên sẽ không có chuyện áp dụng ngẫu nhiên một cái rồi làm hỏng toàn bộ
  • Khi tạo migration mới, mặc định là chế độ interactive nên mọi thay đổi đều được xác nhận ngay trên dòng lệnh

Hiệu năng

  • Tôi không xử lý dữ liệu quá lớn nên không cần một DB hiệu năng cực cao
  • Nhưng vì bên dưới dùng Postgres nên xét về hiệu năng cũng không thành vấn đề so với các DB khác
  • Bản thân EdgeDB được viết bằng Python (giá mà là Go thì hay hơn, nhưng có vẻ đội phát triển quen Python hơn)

Thư viện client Go

  • Vì tôi dùng Go nên việc có thư viện Go native cho EdgeQL là một điểm cộng lớn
  • Có thư viện chính thức cho Typescript/Javascript, Python, Go; còn .Net và Elixir thì do cộng đồng hỗ trợ

Nâng cấp

  • EdgeDB trừu tượng hóa phần phức tạp liên quan đến phiên bản server và cập nhật
  • EdgeDB CLI cơ bản là tự xử lý hết. Có bản cập nhật mới thì nó báo và nâng cấp luôn.
    → Mượt đến mức đáng ngờ
  • Hiện tại 2.0 RC đã ra nhưng tôi hoàn toàn không lo lắng. Những trải nghiệm đến giờ khiến tôi tin rằng việc nâng cấp sẽ an toàn và dễ dàng

Giao tiếp và hỗ trợ

  • Với tư cách early adopter, tôi rất hài lòng vì luôn nhận được phản hồi và hỗ trợ cực nhanh trên các kênh chính thức của EdgeDB

EdgeDB 2.0

  • Bản 2.0 phát hành vào ngày mai sẽ bổ sung nhiều tính năng hay
    • EdgeDB UI: ứng dụng web bao gồm trình chỉnh sửa schema trực quan, REPL, v.v.
    • Group query, biến schema toàn cục, bảo mật theo từng object, Direct EdgeQL over HTTP, v.v.

Những điều tôi không thích hoặc còn lo ngại

  • Cam kết về khả năng tương thích
    • Cho đến giờ mọi thứ đều ổn. Các bản cập nhật minor không phá vỡ tương thích
    • Sẽ tốt hơn nếu có một cam kết rõ ràng về khả năng tương thích
  • Bộ tính năng ngày càng phình to
    • Ngay cả bây giờ cũng đã có nhiều tính năng hơn mức tôi mong muốn, và nó vẫn đang tiếp tục tăng
    • EdgeQL càng mạnh thì ranh giới giữa DB và server càng mờ đi, khiến tôi phải băn khoăn "cái này nên nằm ở backend, hay nên đưa vào một DB schema thông minh?"
    • Dùng HTTP server nhúng và đẩy theo hướng thay thế hoàn toàn backend server trong phần lớn dự án nghe có vẻ hợp lý, nhưng... tôi muốn có một DB ổn định với ngôn ngữ truy vấn và engine tuyệt vời này
  • Dù sao thì tôi vẫn mong EdgeDB giữ được sự ổn định và nhất quán, đồng thời không phình thêm quá nhiều tính năng. Chỉ với bộ tính năng hiện tại cũng đã rất xuất sắc

Kết luận

  • Trong các dự án tương lai, tôi không còn ý định cân nhắc các RDB truyền thống nữa
  • Quay lại SQL với tôi cũng như từ Flutter quay về Ncurses, hoặc từ Go quay lại assembly vậy
  • Với tôi, EdgeDB là bước tiến lớn nhất của lĩnh vực DB trong 20 năm qua.
  • Có thể quan điểm này sẽ thay đổi khi tôi có thêm trải nghiệm, nhưng sau hơn 1 năm sử dụng vẫn chưa có gì làm niềm vui đó phai đi
  • Càng dùng tôi càng tin tưởng EdgeDB
  • Mọi thứ mà đội ngũ EdgeDB đã làm với chính EdgeDB, ngôn ngữ, website, công cụ và cộng đồng đều cực kỳ ấn tượng
    → "Mad respect to the team"
  • Và có vẻ như họ mới chỉ đang khởi động mà thôi

10 bình luận

 
triumph1 2024-10-02

Nhờ vậy mà mình biết đến EdgeDB và đang dùng rất ổn! Cảm ơn nhé~

 
extremer 2022-08-27

Có vẻ như đang đi theo con đường tương tự prisma. Tôi đang dùng prisma khá tốt, nhưng vẫn có nhiều điểm hơi tiếc về mặt hiệu năng, nên kết quả benchmark này cũng hơi khiến tôi bị thu hút đấy nhỉ?
Cú pháp thì không hẳn đúng gu của tôi lắm.. (tôi cũng đang dùng protobuf, mà cả sample code chuyển đổi cũng hơi...)

Mọi người khác có thích kiểu cú pháp giống graphQL như thế này không? Với tôi thì cuối cùng backend vẫn là RDS, nên dù sao ở giữa cũng sẽ phải có phần conversion, mà nếu điều đó không được thể hiện rõ ràng thì tôi hơi ngại dùng...

 
dextto 2022-08-14

Sau khi xem bài đăng này, tôi thấy hứng thú nên vẫn đang tiếp tục tìm hiểu.
Nhưng có lẽ vì vẫn còn ở giai đoạn đầu nên khi gặp chỗ vướng thì kết quả tìm kiếm vẫn chưa có nhiều.
Có kênh Discord đấy, nhưng tôi nghĩ sẽ tốt hơn nếu các lập trình viên trong nước có thể thoải mái hỏi đáp với nhau, nên tôi đã tạo một phòng chat mở.
https://open.kakao.com/o/gtGY0Gve

 
forteleaf 2022-07-29

Tôi cũng muốn thử dùng nên đã ghi chú lại.

 
ryuheechul 2022-07-28

Đọc bài này xong rồi hoàn thành hết tutorial thì tôi càng thấy bị thuyết phục hơn.

 
yunyun0505 2022-07-28

Thú vị đấy. Đã không thể quay lại một thế giới không có SQL nữa rồi..

 
jujumilk3 2022-07-27

Nghe có vẻ thú vị đấy.

 
nicewook 2022-07-27

Thật ấn tượng!

 
bbulbum 2022-07-27

Trong nhóm graphdb thì mình đang khá quan tâm đến ArangoDB, nhưng có lẽ cũng nên thử tìm hiểu EdgeDB nữa.

 
xguru 2022-07-27

Lời khen quá đỉnh. Họ cho biết sẽ công bố 2.0 vào 10 giờ sáng ngày 28/7 (PT).

Phát hành EdgeDB 1.0
EdgeDB - ORDB mã nguồn mở thế hệ mới dành cho nhà phát triển