ORM: Nên hay không nên?

Phạm Chính Hữu
OneID Engineering
Published in
5 min readJan 1, 2020

Đối với nhiều lập trình viên thì việc lựa chọn sử dụng ORM hay sử dụng trực tiếp các câu truy vấn của MySQL được quyết định bởi sở thích hoặc theo yêu cầu của team. Vậy việc sử dụng ORM có thực sự tốt hay không, đem lại lợi ích gì hay có những yếu điểm gì? Người viết hy vọng sẽ giải đáp được phần nào câu hỏi trong bài viết này.

Các cuộc tranh luận về việc nên hay không nên sử dụng ORM không phải là về các vấn đề công nghệ mà về việc các giá trị mà ORM đem lại. Nên hay không nên sử dụng ORM thường được quyết định bới việc lập trình viên coi trọng điều gì quan trọng hơn: truy cập data một cách rõ ràng hay viết code rõ ràng.

  • Quan điểm 1: lập trình viên nên tập trung vào model level và không coi trọng tới việc lưu trữ và truy xuất dữ liệu. Với những người đồng ý quan điểm này thì ORM là một phương tiện tốt bởi vì ORM đã mô tả việc lưu trữ và truy cập dữ liệu ở mức high level thông qua các model object.
  • Quan điểm 2: lập trình viên nên tập trung vào persistence level . Trong trường hợp này, các lập trình viên không sử dụng ORM mà tự triển khai việc truy xuất và lưu trữ dữ liệu bằng việc sử dụng plain SQL . Việc này giúp cho mọi hành động truy cập tới cở sỡ dữ liệu được rõ ràng và kiểm soát hoàn toàn bởi các lập trình viên.

Vậy quan điểm nào là đúng đắn?

Cách làm việc của ORM

Trước hết chúng ta phải đi vào các ưu điểm và nhược điểm của các ORM framework.

Ưu điểm:

  1. Dễ dàng thực hiện công việc liên quan với thêm đọc sửa xóa dữ liệu, do đó sẽ cần ít code hơn so với việc sử dụng SQL.
  2. Có các phương thức để kiểm tra tính đúng đắn với các tác vụ ghi dữ liệu.
  3. Gán dữ liệu trực tiếp từ cơ sở dữ liệu vào các object.
  4. Cache Mangement: các đối tượng (entities) được cache trong bộ nhớ giúp giảm tải cho DB.
  5. Lập trình viên không cần quan tâm quá nhiều vào sự khác biệt giữa các phiên bản của DB (MySQL, OrracleSQL, PostgreSQL, ...)

Nhược điểm:

  1. Rất khó để tối ưu và debug vì các câu lệnh SQL đều được tự sinh bởi framework.
  2. Cần thời gian để chuẩn bị các metadata.
  3. N+1 problems. Ví dụ như để triển khai câu lệnh tương đương với SQL "INSERT INTO ... ON DUPLICATE UPDATE ..." thì GORM đã triển khai như sau:

Như vậy, chúng ta có thể thấy việc sử dụng ORM hay là tốt hay không tốt rất phụ thuộc vào việc chúng ta sử dụng trong hoàn cảnh và mục đích nào. Hai quan điểm nêu ở trên đều không hoàn toàn đúng hoặc hoàn toàn sai. Mỗi cách tiếp cận đều có thể dẫn tới good code bad code. Hầu hết đối với các lập trình viên, việc sử dụng ORM hay không phụ thuộc vào sở thích và team hơn là dựa vào việc chứng minh ORM là tốt hay không.

Sau đây là một best practices trong việc ứng dụng ORM:

  • Nếu bạn có kế hoạch sử dụng ORM, bạn nên định nghĩa model objects càng đơn giản càng tốt, nếu không chương trình của bạn sẽ là một mớ bòng bong trong việc đảm bảo ORM hoạt động đúng theo ý muốn của bạn.
  • Nếu bạn sử dụng plain SQL, bạn nên định nghĩa các DAO hoặc một tầng tương tự để có thể tách tầng truy cập dữ liệu với tầng ứng dụng (de-coupling rule).
  • Nếu việc truy cập cơ sở dữ liệu của chương trình gồm các tác vụ đơn giản thì bạn nên nghĩ tới việc sử dụng ORM. Mặc dù việc sử dụng ORM có thể làm việc xây dựng các truy vấn trở nên phức tạp và trong một vài trường hợp thì rất khó để debug, nhưng ORM có thể giúp bạn tiết kiệm được rất nhiều thời gian và code.
  • Nếu việc truy cập cơ sở dữ liệu gồm nhiều câu truy vấn phức tạp và/hoặc sử dụng các tính năng dành riêng cho từng loại cơ sở dữ liệu, bạn có thể không muốn sử dụng ORM. Mặc dù nhiều ORM (như Hibernate) cung cấp cho các lập trình viên các phương thức kết nối với cơ sở dữ liệu và sử dụng trực tiếp các câu lệnh SQL, nhưng lúc đó giá trị của ORM mang lại không thực sự nhiều trong khi đó tiềm ẩn nhiều nguy cơ gây ra các bug không báo trước.
  • Trong trường hợp mà chúng ta cần quân tâm tới tốc độ truy vấn tới cơ sở dữ liệu, thì ORM không phải là lựa chọn tốt. Cách duy nhất để đảm bảo các truy vấn của bạn hoạt động một cách tối ưu và nhanh nhất là khi bạn viết ra các câu truy vấn với các điều kiện chặt chẽ chỉ phù hợp với cấu trúc hoặc phiên bản cơ sở dữ liệu bạn sử dụng.

Như đã đề cập trong bài viết, việc sử dụng ORM hay không trong phần lớn trường hợp tùy thuộc vào sở thích của lập trình viên hoặc do yêu cầu của team. Tuy nhiên, theo người viết thì việc lựa chọn đúng kỹ thuật cho chương trình của bạn nên dựa theo các yêu cầu kỹ thuật của nó, và với ORM đó là: kiểm soát hoàn toàn việc truy cập dữ liệu một cách nhất quán hay viết ít code hơn mà vẫn đảm bảo được việc truy cập dữ liệu.

Link tham khảo:

https://kurapov.ee/eng/tech/ORM-is-harfmul-pattern/

--

--