Tại sao ORM không nên đặt cược tốt nhất của bạn

Khi tôi bắt đầu lập trình, vài năm trước, ORM giống như máu sống của các dự án phần mềm. Môi trường nhấn mạnh sự khớp nối chặt chẽ giữa cơ sở mã và lớp ORM. Có thể nói rằng tôi đã được đào tạo để không nghĩ về các dự án mà không có ORM.

Nhưng khi tôi có được kinh nghiệm và kiến ​​thức sâu hơn về các dự án cụ thể, tôi nhận ra rằng hầu hết các cải tiến cuối cùng đã đến điểm mà dòng chảy đang đi vào khuôn khổ ORM. Đó là khi tôi tự hỏi: nếu dự án này không có ORM thì sao?

Tôi bắt đầu suy nghĩ về những vấn đề ORM đã giới thiệu:

  • Bạn có thể tối ưu hóa mã của mình ngay cả khi bạn thực sự cần thêm tốc độ đó; Mã ORM sống trong một vùng đất của riêng mình.
  • Tầm nhìn vào những gì đang xảy ra ở mức tối thiểu.
  • Các tài liệu thường rất lớn và phân mảnh khiến việc tìm kiếm chi tiết cụ thể trở nên khó khăn.

Chúng có vẻ như là những vấn đề nhỏ nhưng chúng làm giảm đáng kể năng suất. Ngoài ra, tôi nhận ra rằng hệ sinh thái ORM tách rời khỏi sự phát triển web chính thống với thương hiệu riêng về các vấn đề và hạn chế. Các ORM thường mang lại sự phức tạp không cần thiết, cung cấp sự trừu tượng hóa rò rỉ trên các tương tác cơ sở dữ liệu. Chúng đôi khi có một đường cong học tập dốc và các nhà phát triển có xu hướng coi chúng như một hộp đen.

Tôi đã thấy các nhà phát triển thực hiện các cách tiếp cận khác nhau để giải quyết vấn đề ORM. Một số loại bỏ hoàn toàn các khung ORM thường là một nhiệm vụ Herculean tùy thuộc vào mức độ phức tạp của dự án. Một số chấp nhận ORM và mã thích ứng trong dự án của họ; họ sẵn sàng thỏa hiệp về hiệu suất và không quan tâm đến sự phức tạp thêm vào. Nhiều người trong số họ chọn con đường vàng nơi họ tiếp tục sử dụng ORM nhưng các truy vấn mới hoặc phức tạp bị loại trừ. Một số trong số họ thực sự tạo ra lớp bản đồ riêng của họ cụ thể cho dự án và theo nhu cầu.

Cho đến nay, tôi đã làm việc với Hibernate (Java) và Mongoose (khung ORM trong Node cho MongoDB). Khi tôi đến một dự án Node đã sử dụng Mongoose làm ORM, tôi có một nhiệm vụ to lớn là tái cấu trúc gần như toàn bộ dự án. Lúc đầu, tôi nghĩ về việc loại bỏ hoàn toàn khung ORM. Nhưng các đồng nghiệp của tôi sẽ không hài lòng nếu không có những con số ủng hộ tôi. Vì vậy, tôi đã điểm chuẩn thời gian truy vấn có và không có Mongoose. Đây là kết quả.

Họ làm tôi ngạc nhiên. Tôi đã mong đợi một hiệu suất tăng khi không sử dụng Mongoose nhưng không đến mức này. Với dữ liệu này trong tay, sự lựa chọn đã rõ ràng: ORM đã được đưa ra. Vài tháng sau, một đồng nghiệp hỏi tôi rằng họ nên sử dụng Sequelize hay PG để truy cập cơ sở dữ liệu Postgres. Nhận ra rằng Sequelize là một ORM, tôi đã bỏ phiếu cho PG, nhưng yêu cầu anh ta chấm điểm hai. Tôi muốn xác minh xem sự ghét ORM có hợp lý hay không và một khi các con số quay trở lại, hóa ra nó thực sự hoàn toàn hợp lý.

Đoán xem thư viện nào anh ấy đã đi trước.

Một điều cần nhớ ở đây là khi chúng tôi từ bỏ ORM, có thể là Mongoose hoặc Sequelize, chúng tôi đã nhận thức được những gì đã từ bỏ. Kiểm tra lược đồ cụ thể, các phương thức dựng sẵn, trừu tượng, v.v. là những lợi ích của việc sử dụng khung ORM. Một mối quan tâm lớn là thiếu kiểm tra lược đồ (khi không sử dụng ORM), điều gì đó có thể dẫn đến dữ liệu xấu đi vào DB. Để giải quyết vấn đề này, chúng tôi đã sử dụng Joi, giúp cho công việc của chúng tôi dễ dàng hơn trong khi vẫn giữ nguyên hiệu suất. Đối với các phần khác, chúng tôi cần phải viết một vài dòng mã bổ sung nhưng nó đáng giá. Tốt hơn là mất hàng chục mili giây (đôi khi thậm chí là vài giây) trên mỗi truy vấn.

Tôi không cố gắng bash ORM và chúng thực sự tốt cho người mới bắt đầu và các dự án quy mô nhỏ. Nhưng khi dự án của bạn mở rộng ra một số lượng lớn các truy vấn và tài liệu, ORM có thể trở thành nút cổ chai. Hãy nghĩ về họ như chiến tranh Việt Nam, bạn cần quyết định khi nào nên rút ra và chạy, nếu không thì thiệt hại lớn là không thể tránh khỏi.