ORM là gì?

Giới thiệu ORM

ORM viết tắt của Object-Relational Mapping (cũng có thể được gọi với tên khác là ORM, O/RM, O/R Mapping) có thể dịch "Ánh xạ Quan hệ-Đối tượng" là một kỹ thuật lập trình để chuyển đổi dự liệu giữa hệ thống Cơ sở dữ liệu quan hệ sang tương thích với các ngôn ngữ lập trình hướng đối tượng. Thực tế việc này tạo ra một CSDL đối tượng ảo có thể sử dụng từ bên trong các ngôn ngữ lập trình (hướng đối tượng). Có nhiều các công cụ, thư viện cả miễn phí lẫn thương mại để thực hiện việc ánh xạ này mặc dù một số Lập trình viên tự có thể xây dựng công cụ ORM của riêng họ.

Trong lập trình hướng đối tượng, các tác vụ quản lý dữ liệu hoạt động trên các đối tượng hầu như luôn luôn là các giá trị không vô hướng.
Ví dụ: mục nhập trong sổ địa chỉ đại diện cho một người cùng với không hoặc nhiều số điện thoại và không hoặc nhiều địa chỉ. Điều này có thể được mô hình hóa trong triển khai hướng đối tượng bởi một "đối tượng Person" với các thuộc tính / trường để giữ từng mục dữ liệu mà mục nhập bao gồm: tên của người đó, danh sách số điện thoại và danh sách địa chỉ. Danh sách số điện thoại tự nó sẽ chứa "đối tượng PhoneNumber", v.v. Mục nhập sổ địa chỉ được ngôn ngữ lập trình coi là một đối tượng duy nhất (ví dụ, nó có thể được tham chiếu bởi một biến duy nhất chứa một con trỏ đến đối tượng). Nhiều phương thức khác nhau có thể được liên kết với đối tượng, chẳng hạn như phương thức trả về số điện thoại ưa thích, địa chỉ nhà riêng, v.v.

Tuy nhiên, nhiều cơ sở dữ liệu phổ biến như hệ quản trị cơ sở dữ liệu SQL (DBMS) chỉ có thể lưu trữ và thao tác các giá trị vô hướng như số nguyên và chuỗi được tổ chức trong bảng. Lập trình viên phải chuyển đổi các giá trị đối tượng thành các nhóm giá trị đơn giản hơn để lưu trữ trong cơ sở dữ liệu (và chuyển đổi chúng trở lại khi truy xuất) hoặc chỉ sử dụng các giá trị vô hướng đơn giản trong chương trình. Ánh xạ quan hệ đối tượng thực hiện cách tiếp cận đầu tiên.

Trọng tâm của vấn đề liên quan đến việc dịch biểu diễn logic của các đối tượng thành dạng nguyên tử hóa có khả năng được lưu trữ trong cơ sở dữ liệu trong khi vẫn bảo toàn các thuộc tính của đối tượng và các mối quan hệ của chúng để chúng có thể được tải lại như các đối tượng khi cần thiết. Nếu chức năng lưu trữ và truy xuất này được triển khai, các đối tượng được cho là bền vững.

Ưu điểm

Theo quan điểm cá nhân, tôi thấy rằng những ưu điểm đáng nói đến của các thư viện ORM như sau:

  • Các thao thác CRUD (Create Read Update Delete) không bị ảnh hưởng bởi các câu lệnh SQL
  • Xác thực dữ liệu trước khi thực thi các câu lệnh SQL
  • Các đối tượng được tạo ra dưới dạng kết quả trả, hiệu quả vì định nghĩa giản đồ (schema) chặt chẽ, ẩn đi hết các câu lệnh được tự động hoàn thành, tạo json
  • Các phương thức như save(), delete() cụ thể và rõ ràng hơn các câu lệnh truy vấn SQL thuần túy
  • Bộ lọc có thể được tạo với các khối nghiêm ngặt bằng cách sử dụng các tiêu chí của API (có nhiều mô-đun hơn) so với nối chuỗi SQL

Nhược điểm

Các thư viện ORM mô tả một loạt các khái niệm trừu tượng tuy nhiên vẫn không đầy đủ và thiếu sót. Điều này có thể nhận thấy trong nhiều chi tiết khi cần tìm hiểu và nghiên cứu hầu hết mọi thư viện ORM.

  • Giao dịch (Transaction) là một khái niệm không có nguồn gốc cho quy trình trong bộ nhớ đơn luồng. Bạn vẫn cần phải nêu rõ ràng trong mã rằng bạn đang bắt đầu giao dịch và thêm phần thử-bắt-thử lại hoặc bạn phải luôn sử dụng giao dịch cho mỗi yêu cầu thường bị khóa quá nhiều. Một vấn đề khác là bạn không thể kiểm soát thứ tự các truy vấn, điều này khiến bạn rất dễ gặp phải tình trạng bế tắc trong các tác vụ yêu cầu đồng thời. Vì vậy ORM không trừu tượng hóa khái niệm giao dịch
  • Các liên kết trong CSDL bao gồm các quan hệ Một-Nhiều (1:N), Nhiều-Nhiều (N:M). Trong khi các đối tượng quan hệ với nhau bởi các quan hệ: kế thừa, đóng gói, tham chiếu. Việc này cũng ảnh hưởng đến thời điểm tải các hàng trong CSDL được liên kết. Đối với lớp trừu tượng, có quá nhiều chi tiết cần được cài đặt. Thông thường được giải quyết bằng cách buộc các khai báo đối tượng ở giữa với nhau.
  • Bình đẳng. Ngữ nghĩa của hàm chức năng có thể phụ thuộc vào dữ liệu đến từ đâu. Điều gì sẽ xảy ra nếu bạn so sánh một đối tượng đến từ CSDL và một đối tượng thuần túy được xây dựng nguyên bản nếu tất cả các trường đều giống nhau? Nó phụ thuộc. Trong CSDL, bạn có thể có nhiều hàng với các mục nhập dữ liệu giống nhau và bạn có thể chỉ định chỉ mục UNIQUE nghĩa là gì. Trong thế giới bộ nhớ, bạn có thể so sánh theo tham chiếu hoặc theo giá trị, nhưng trong thực tế, mô hình của bạn cần bối cảnh nơi dữ liệu đến từ đó, để nó có thể quyết định xem nó có giống dữ liệu hay không.

Mỗi ORM đều có sai sót

Vì vậy, các ORM làm thư viện đã có sai sót ngay từ đầu. Và mọi quá trình triển khai đều thêm các vấn đề khi thực hiện. Một số không thể ánh xạ lại các trường dữ liệu, một số không thể lưu trữ thời gian chính xác như cơ sở dữ liệu có thể nguyên bản, một số không tham chiếu các cột theo cách nhất quán ...

Các thư viện ORM theo các ngôn ngữ lập trình

Ngôn ngữ lập trình Thư viện ORM
C# NHibernate, Entity Framework
Java JPA, Hibernate, EclipseLink, Oracle TopLink, OpenJPA
PHP Propel, Doctrine, Eloquent, RedBean
Python SQLAlchemy, Django
Ruby ActiveRecord, DataMapper
Node.js Bookshelf, Knex, Objection, Sequielize, Waterline
Golang GORM