Có nên sử dụng ORM cho dự án của bạn?

9 min read

Một trong những thách thức của việc sử dụng ngôn ngữ lập trình hướng đối tượng và cơ sở dữ liệu là sự phức tạp khi trong việc thao tác với dữ liệu có cấu trúc trong code. Object-relational mapping (ORM) là một kỹ thuật mà tạo một tầng giữa ngôn ngữ lập trình và cơ sở dữ liệu, giúp cho developer có thể làm việc với dữ liệu mà không cần biết quá nhiều về SQL.

Thách thức mà một lập trình viên sử dụng ngôn ngữ lập trình OOP là cần hiểu được ngôn ngữ truy vấn có cấu trúc( tức là SQL) để kết nối ứng dụng của họ với một cơ sở dữ liệu. Đối với developer có kiến thức về SQL thì có thể viết những câu truy vấn để truy cập vào database một cách dễ dàng.

Tuy nhiên để viết những câu raw SQL cần thiết một lượng thời gian khổng lồ. Bởi vì khi lấy dữ liệu từ database, developer cần trích xuất những dữ liệu cần thiết từ kết quả trả về. Sau đó lại dùng dữ liệu đó để tạo ra các object.

ORM là một Framework khá nối tiếng nhưng cũng rất tai tiếng. Đối với những người ủng hộ, họ nói rằng ORM làm tăng hiệu quả công việc, cải thiện việc thiết kế hệ thống, sử dụng lại được mã nguồn và việc bảo trì trở nên dễ dàng hơn. Nhưng ORM lại gặp những lời chỉ trích về mặt hiệu năng.

Bài viết này sẽ mang đến cho bạn những góc nhìn tổng quan về ORM, so sánh giữa ORM và SQL, ưu điểm và nhược điểm. Thông qua đó bạn có thể quyết định liệu có nên sử dụng ORM cho ứng dụng của mình hay không.

ORM là gì?

Object-Relational Mapping (ORM) là một kĩ thuật giúp thu hẹp khoảng cách giữ ngôn ngữ lập trình hướng đối tượng và cơ sở dữ liệu quan hệ. ORM framework cung cấp một layer trừu tượng, cho phép developer làm việc với các đối tượng bằng ngôn ngữ lập trình mà họ lựa chọn trong khi tương tác một cách liền mạch với cơ sở dữ liệu.

Nhiệm vụ của ORM là ánh xạ các object với các bảng trong database, xử lý việc lấy và thao tác với dữ liệu. Làm cho quá trình làm việc với database trở nên đơn giản.

SQL về cơ bản là gì?

SQL là một ngôn ngữ mạnh mẽ cho phép developer thực hiện rất nhiều công việc trong cơ sở dữ liệu quan hệ. Nó cho phép tạo lược đồ cơ sở dữ liệu, tạo bảng, index, cũng như chạy các truy vấn để lấy dữ liệu, cập nhập và xóa. Dưới đây là một ví dụ cực kỳ đơn giản:

SELECT * FROM users;

Trong câu query trên, lệnh SELECT lấy dữ liệu từ bảng có tên là users. Ký tự * đại diện cho tất cả các cột trong bảng đó. Truy vấn SQL còn có thể bao gồm các điều kiện, các loại join, các hàm tính toán và sắp xếp mà sẽ được sử dụng các các truy vấn phức tạp.

Cách ORM hoạt động

ORM hoạt động bằng cách ánh xạ các đối tượng với các bảng trong cơ sở dữ liệu. Việc ánh xạ này xác định làm thế nào các đối tượng được lưu lại trong database và làm thế nào để lấy ra khi cần. ORM framework thông thường sử dụng “metadata” hoặc các “annotation” để định nghĩ việc ánh xạ này.

Một khi việc ánh xạ được thiết lập, chúng ta có thể thực hiện việc CRUD (Create, Retrieve, Update, Delete) ngay trên các đối tượng và ORM sẽ đảm nhiệm việc dịch những đoạn mã viết bằng ngôn ngữ lập trình hướng đối tượng thành những truy vấn SQL.

Dưới đây là một đoạn mã Java đơn giản để định nghĩa cho việc ánh xạ:

@Entity
@Table(name = "employee")
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id")
    private UUID id;

    @Column(name = "name", nullable = false, length = 100) 
    private String name;

    @Column(name = "department", nullable = false, length = 50) 
    private String department;

    @Column(name = "salary", nullable = false) 
    private double salary;

    // setter and getter
    ...
}

Với một ORM framework, chúng ta có thể định nghĩa cách ánh xạ giữa class Employee với một table tương ứng trong cơ sở dữ liệu. ORM sẽ xử lý việc dịch những thao tác với object của class này thành những câu query SQL. Cho phép chúng ta tương tác với cơ sở dữ liệu bằng cách sử dụng những cú pháp của lập trình hướng đối tượng.

Những sự khác biệt chính giữa SQL và ORM

SQLORM
Thao tác với dữ liệuĐược thực hiện bằng cách viết những câu query bằng cú pháp của SQL.
Cung cấp phương thức để thao tác với dữ liệu một cách trực tiếp trên đối tượng. Chúng ta chỉ cần update thuộc tính của đối tượng và dùng phương thức save để lưu lại những thay đổi vào trong database
Mô hình hóa dữ liệuLiên quan đến việc tạo bảng, định nghĩa quan hệ giữa các bảng và xác định những ràng buộc. Nhiệm vụ của developer là thiết kế lực đồ cơ sở dữ liệu và viết những truy vấn SQL để tạo cũng như chỉnh sửa các bảngNgược lại với ORM thì sử dụng mô hình hướng đối tượng để định nghĩa cấu trúc của dữ liệu. Người dùng cần phải định nghĩa những class đại diện cho các bảng và ORM sẽ xử lý việc tạo và sử đổi các bảng
Sự độc lập giữa các cơ sở dữ liệu quan hệĐối với mỗi hệ thống cơ sở dữ liệu lại cần các câu truy vấn SQL dành riêng cho chúng. Nếu một ứng dụng sử dụng các query cho một database cụ thể thì có thể cần rất nhiều nỗ lực để chuyển sang sử dụng một hệ thống cơ sở dữ liệu khácCung cấp một tầng trừu tượng cho phép ứng dụng có thể làm việc với các hệ quản trị cơ sở dữ liệu khác nhau mà không phải thay đổi mã nguồn
Hiệu năngCác câu query viết bằng SQL có thể dễ dàng kiểm soát được cách dữ liệu được lấy ra và dễ dàng trong việc tối ưu truy vấn. Chúng ta có thể sử dụng analyze query, tạo index, điều chỉnh các truy vấn để cải thiện hiệu năngHạn chế quyền kiểm soát của developer đối với việc tối ưu hóa truy vấn. Nhưng cũng cung cấp các cơ chế để tối ưu hóa hiệu năng ví dụ như lazy loading, query caching

Ưu điểm

  • Đơn giả hóa các thao tác với database: ORM trừu tượng hóa những phần phức tạp của các query và cung cấp một cách trực quan để có thể tương tác với database. Lập trình viên chỉ cần tập trung làm việc với các đối tượng và để cho ORM thực hiện phần còn lại.
  • Độc lập với cơ sở dữ liệu: Do ORM cung cập một layer cho phép ứng dụng có thể làm việc với các cơ sở dữ liệu khác nhau mà không phải sửa lại code. Điều này cho phép chuyển đổi một cách linh hoạt giữa các database một cách dễ dàng
  • Giúp tăng hiệu quả làm việc: ORM giúp tự động hóa các thao tác phố biến với cơ sở dữ liệu, như CRUD, tối ưu truy vấn và kiểm tra dữ liệu. Việc tự động hóa này làm giảm đáng kể đoạn mã lập đi lập lại mà chúng ta cần viết.
  • Giảm gánh nặng cho quá trình kiểm thử: Code được sinh ra bởi ORM được đánh giá rất dễ test, bạn có thể không cần dành quá nhiều thời gian cho việc test đoạn mã truy cập cơ sở dữ liệu. Thay vào đó, bạn có thể tập trung vào test nghiệp vụ của hệ thống

Nhược điểm

ORM là một công cụ tuyệt vời cho nhiều hệ thống, nhưng một số người dùng đã tìm ra một vài điểm yếu trong khi sử dụng ORM. Những vấn đề này dường như liên quan đến độ phức tạp của hệ thống.

Với những hệ thống đơn giản, ORM giúp đỡ khá nhiều cho quá trình phát triển phầm mềm. Nhưng khi mà độ lớn của dự án càng ngày mở rộng, framework này bắt đầu lộ ra những vấn đề tiềm ẩn

  • Hiệu năng: Nhưng lời phàn nàn phổ biến của nhưng lập trình viên là quá nhiều code được sinh ra bởi ORM. Những đoạn code này làm ứng dụng chậm đi một cách đáng kể và làm cho dự án khó bảo trì hơn. Một ORM được thiết kế tốt có thể tạo đoạn code chất lượng cao mà không ảnh hưởng đến tốc độ ứng dụng.
  • Cần có sự hiểu biết về SQL: không phải query nào sinh ra cũng là tốt nhất và những developer như chúng ta không thể dựa vào ORM 100%. Bạn cần có kiến thức về SQL cũng như đoạn mã do ORM sinh ra.
  • Ánh xa sai: Đôi khi ORM có thể tạo ra những ánh xạ không chính xác giữa các class và table. Vấn đề này có thể khó nhận biết và gây nhiều vấn đề cho hệ thống

Tổng kết

Tóm lại là để viết những câu raw SQL cho những ngôn ngữ lập trình hướng đối tượng có thể khá mất thời gian. Là lập trình viên bạn có thể viết raw SQL query hoặc sử dụng SQL query builder để cải thiện quá trình viết mã.

Tuy nhiên cả hai cách này vẫn yêu cầu một lượng kiến thức nhất định về database và khả năng viết query. ORM nâng cao năng suất bằng cách tạo các mô hình dữ liệu có tính trừu tượng và tự sinh ra các query cần thiết. Tuy nhiên ORM cũng có điểm yếu của nó.

Vậy thì có nên sử dụng hay không? Ý kiến cá nhân của tôi là vẫn sử dụng ORM trong những tình huống đơn giản như CRUD với một hoặc một số lượng ít các đối tượng.

Nhưng đối với những logic cần câu truy vấn phức tạp cần sự tối ưu hoặc cần update một số lượng lớn dữ liệu. Thì bạn biết phải sử dụng cái gì rồi đó :))
Cuối cùng cảm ơn bạn đã đọc đến đây. Hy vọng bài viết mang lại cho bạn những kiến thức hữu ích. Hãy để lại bình luận nếu bạn thấy bất kỳ nội dung nào cần chỉnh sửa.

Chào thân ái và quyết thắng

Avatar photo

Clean Code: Nguyên tắc viết hàm trong lập trình…

Trong quá trình phát triển phần mềm, việc viết mã nguồn dễ đọc, dễ hiểu là yếu tố then chốt để đảm bảo code...
Avatar photo Dat Tran Thanh
3 min read

Clean Code: Nguyên tắc comment trong lập trình

Trong lập trình, code không chỉ là một tập hợp các câu lệnh để máy tính thực thi, mà còn là một hình thức...
Avatar photo Dat Tran Thanh
3 min read

Clean Code: Nguyên tắc xử lý lỗi (Error Handling)

Trong quá trình phát triển phần mềm, việc xử lý lỗi không chỉ là một phần quan trọng mà còn ảnh hưởng trực tiếp...
Avatar photo Dat Tran Thanh
4 min read

Leave a Reply

Your email address will not be published. Required fields are marked *