Trong cách phát triển ứng dụng web hiện nay chắc hẳn các bạn đã quen với với từ khóa ORM(Object Relational Mapping). Khi mà thời đại của các framework ứng với các ngôn ngữ đang lên ngôi một cách mạnh mẽ, ORM gần như là sự lựa chọn tuyệt vời của các nhà phát triển hiện nay.

Bạn đang xem: Orm là gì

ORM giúp chúng ta dễ dàng thao tác với dữ liệu vớiDatabase hơn, giúp chúng ta dễ code, dễ maintain hơn . . . Ở bài viết này tôi sẽ giới thiệu chung về ORM, đi sâu vào phân tích các điểm ưu điểm, nhược điểm và khi nào áp dụng chúng trong các dự án thực tế.

Để cho dễ theo dõi từ thời điểm này của bài viết tôi xin được dùng ORM thay cho cụm từ Object Relational Mapping

*

1. ORM là gì ?

Theo Wikipedia:

Object-relational mapping (ORM, O/RM, and O/R mapping tool) in computer science is a programming technique for converting data between incompatible type systems using object-oriented programming languages. This creates, in effect, a “virtual object database” that can be used from within the programming language. There are both free and commercial packages available that perform object-relational mapping, although some programmers opt to construct their own ORM tools.

Hiểu một cách đơn giản thì

ORM là 1 kỹ thuật lập trình giúp ánh xạ các record dữ liệu trong hệ quản trị cơ sở dữ liệu sang dạng đối tượng đang định nghĩa trong các class – một khái niệm phổ biến được sử dụng trong tất cả các ngôn ngữ hiện đại ngày nay như: Java, PHP, Ruby. Bạn có thể áp dụng kĩ thật này với bất cứ dự án nào bạn thích.

*

Theo Martin Fowler có hai patterns được áp dụng cho các cách thiết kế ORM khác nhau.

Một sốORMnổi tiếng sử dụng Active Record có thể kể tên là: Eloquent, CachePHP, JOOQ, TOPLINK

*

*

Một số ORM nổi tiếng sử dụng Data Mapper như: Doctrine, Hibernate, SqlAlchemy

2. ORM hoạt động như thế nào ?

Đặc trưng cơ bản của ORM là gói gọn CSDL trong 1 object. 1 phần của object sẽ chứa data, và phần còn lại lo việc data xử lý như nào và biến nó thành CSDL quan hệ.

ORM giải quyết vấn đề đồng bộ giữa kiểu dữ liệu trả về khác nhau. Một bên là cơ sở dữ liệu, ở đó dữ liệu được thể hiện dưới dạng tập hợp các bản ghi. Một bên là các đối tượng, ở đó dữ liệu đc hiện thị dưới dạng object

*

*

3. Ưu và nhược điểm ORM

Ví dụ về việc tìm kiếm danh sách bản ghi với điều kiện với sql thuần

book_list = new List();sql = “SELECT * FROM library WHERE author = “Linus””;data = query(sql);while (row = data.next()){ book = new Book(); book.setAuthor(row.get(“author”); book_list.add(book);}Với ORM, nó sẽ đơn giản như sau

book_list = BookTable.query(author=”Linus”);Từ ví dụ đơn giản trên chúng ta dễ dàng nhận thấy các ưu điểm sau khi sử dụng ORM

Ưu điểm

Rất nhiều thứ được thực hiện “tự động”, liên quan tới việc xử lí dữ liệu, trong ví dụ trên chúng ta không cần quan tâm đến việc dùng vòng để convert data từ mysql ra, Chỉ cần biết đầu vào là keyword đầu ra trả lại 1 danh sách các quyển sách có author=LinusViệc sử dụng ORM làm bạn bắt buộc phải viết code theo mô hình MVC, khiến code của bạn dễ sửa đổi, bảo trì hơn.Bạn không cần phải biết quá nhiều về MYSQL, bạn vẫn có thể tiếp cận dễ dàng với ORM.Model k ràng buộc chặt chẽ với ứng dụng, hay nói cách khác, Model thì linh hoạt, vì vậy bạn có thể thay đổi hoặc sử dụng nó bất cứ chỗ nàoORM cho phép bạn tận dụng ưu điểm của OOP như kế thừa dữ liệu mà không phải đau đầu

Nhược điểm

Với mỗi framework sẽ có 1 thư viện ORM khác nhau, tất nhiên là bạn phải mất thời gian học nó. Và vì chúng là thư viện nên sẽ rất “nặng”.Performance ổn đối với các truy vấn thông thường, nhưng Raw SQL sẽ luôn làm tốt hơn với các dự án lớn.ORM được coi là abstracts của DB. Nếu bạn không quan tâm đến những gì thực sự xảy ra khi sử dụng ORM. Nó có thể là cái bẫy với những bài toán N + 1 query.4 Đánh giá performance của ORM

Như ở phần nhược điểm mình có nói ORM sẽ có performance chậm hơn so với việc sử dụng raw sql. Dưới đây là một thống kê với Eloquent ORM của Laravel và raw mysql.Môi trường:

CPU: Quad core Intel Xeon E31220Network: BroaNetXtreme BCM5722 Gigabit EthePCI ExpressMemory: 8.0 GBHDD: 2000.4 GBOperating System: CentOS

4.1 Insert

Ở đây các nhà thử nghiệm đã insert số lượng bài viết khác nhau từ 1000 đến 10000 cho cả 2 kĩ thuật trong mỗi vòng lặp.

Eloquent ORM

Số lượtSố bài viếtLượt 1 (ms)Lượt 2(ms)Lượt 3 (ms)Trung bình cộng (ms)Sai lệch (ms)
11000665,25619,5585,6623,539,97
220001150114011101133,320,81
330001490149014201466,740,41
440001770179016701743,364,29
550002080209022202130,078,10
660002540251025602536,725,16
770002930301030803006,775,05
880003360352033803420,087,17
990003800390038803860,052,91
10100004270436043904340,062,44

Raw SQL

Số lượtSố bài viếtLượt 1 (ms)Lượt 2(ms)Lượt 3 (ms)Trung bình cộng (ms)Sai lệch (ms)
11000195,81189,62180,1188,57,91
22000322,78335,64307,01321,814,33
33000413,4437,62458,24436,422,44
44000598,87567,57559,01575,220,98
55000725,5740,94780,15748,928,17
66000867,93869,12891,27876,113,14
770001000996,14949,05981,728,36
880001150112011301133,315,27
990001190127012201226,740,41
10100001430138014501420,036,05

Từ bảng trên ta có biểu đồ như sau

*

4.2 Update

Ở đây các nhà thử nghiệm đã update số lượng bài viết khác nhau từ 1000 đến 10000 cho cả 2 kĩ thuật trong mỗi vòng lặp.

Xem thêm: Cung Mệnh Là Gì – Cách Tự Tính Cung Mệnh Theo Các Tuổi

Eloquent ORM

Số lượtSố bài viếtLượt 1 (ms)Lượt 2(ms)Lượt 3 (ms)Trung bình cộng (ms)Sai lệch (ms)
11000305,59316,06297,93306,59,10
22000522,06565,12543,43543,521,53
33000778,4772,33790,52780,49,26
440001040101010801043,335,11
550001290124012601263,325,16
660002540251025602536,725,16
770002930301030803006,775,05
880003360352033803420,087,17
990003800390038803860,052,91
10100004270436043904340,062,44

Raw SQL

Số lượtSố bài viếtLượt 1 (ms)Lượt 2(ms)Lượt 3 (ms)Trung bình cộng (ms)Sai lệch (ms)
11000195,81189,62180,1188,57,91
22000322,78335,64307,01321,814,33
33000413,4437,62458,24436,422,44
44000598,87567,57559,01575,220,98
55000725,5740,94780,15748,928,17
66000867,93869,12891,27876,113,14
770001000996,14949,05981,728,36
880001150112011301133,315,27
990001190127012201226,740,41
10100001430138014501420,036,05

Từ bảng trên ta có biều đồ sau

*

4.3 Select

Ở đây các thứ nghiệm chia làm 3 lượt

4.4 Đánh giá và phân tích

Từ các số liệu bên trên có thể dễ dàng thấy được performance của raw sql rõ ràng tốt hơn so với ORM trong tất cả các hành động select, insert, update.

Lí do ở đây là: ORM cần thời gian tạo Model instances, tạo ra các property cho model và transform đối tượng model thành dữ liệu quan hệ trước khi thực hiện việc giao tiếp với database. Tất cả những gì đằng sau nó là Laravel đã convert từng code Eloquent ORM thành câu lệnh SQL thích hợp và sau đó thực thi trên tầng database và trả lại kết quả lại tầng application. Vì vậy thời gian để thực thi 1 tác vụ luôn mất nhiều thời gian hơn so với việc dùng raw sql.

Nhưng khoan, đừng vội nhìn những con số trên mà vội nói ORM là đồ bỏ đi.

Trong thực tế không ai select vài nghìn bản ghi, hay thực hiện việc tạo ra vài nghìn bản ghi trong một lúc.

Tức là khi số lượng bản ghi càng ít thì độ chênh lênh về hiệu suất giảm đi đáng kể. Lúc đó cộng thêm việc sử dụng cách kĩ thuật cache của ORM làm cho ứng dụng của bạn cũng tạm chấp nhận được so với những lợi ích về tốc độ phát tiển ứng dụng(thời gian phát triển), loại bỏ việc sử dụng code lặp đi lặp lại, bảo mật tốt hơn vào nhiều thứ tuyệt vời khác nữa.

5. Tổng kết

Tóm lại, đi xuyên suốt cả bài viết, mình đã mô tả cách hoạt động của ORM, nêu các điểm ưu điểm và nhược điểm của ORM. Việc có nên sử dụng ORMhay không vẫn là đề tài tranh luận chưa có hồi kết.

Về kinh nghiệm của bản thân khi làm dự án, mình thường mix giữa ORM và Raw SQL sao cho hiệu quả, với các truy vấn thông thường, ORM là lựa chọn của mình. Với các tình huống phải thao tác với nhiều bản ghi,raw SQL có vẻ hợp lí hơn. Nhưng khi dùng raw sql bạn phải thực sự cẩn thận về vấn đề Sql injection.

Xem thêm: Co Form E Là Gì – C/o Form E Và Qui Tắc Xuất Xứ China

Cảm ơn các bạn đã theo dõi bài viết trên, trong bài viết có tham khảo từ một số nguồn.

Và lượm nhặt linh tinh mà không nhớ

*

. Hẹn gặp lại các bạn trong các bài viết sau
Chuyên mục: Hỏi Đáp