So sánh nhanh giữa SubSonic, nHibernate và LINQ

Posted 04-02-2009 5:03 PM by Trinh Minh Cuong

So sánh nhanh giữa SubSonic, nHibernate và LINQ

SubSonic do Rob Conery viết cách đây từ năm 2007 dựa trên pattern Active Record. nHibernate cũng tương tự. Hai thư viện này đều được gọi là ORM, Object Relation Mapping. Mình từng thử học nHibernate thấy nó khá loằng ngoằng vì phải dùng file XML để ánh xạ bảng, hoặc kết nối bảng của CSDL với các đối tượng tập collection trong .NET.

Ngược lại SubSonic thì đơn giản hơn, nó có một tool quét tất cả các bảng, stored procedure trong CSDL chủ yếu ở đây là SQL 2005 trở lên, Oracle cũng hỗ trợ nhưng mình chưa thử. Sau có thông tin đầy đủ về tên bảng, tên cột, kiểu dữ liệu của cột thì SubSonic sẽ sinh mã C# định nghĩa các collection chứa class, trong class có các trường thành viên tương ứng với cột. SubSonic có thể mô tả được cả quan hệ một-nhiều. NHibernate cũng vậy.

Đối với stored procedure, thì SubSonic sinh mã là các hàm static. Khi lập trình viên CSDL thay đổi cấu trúc bảng, sửa, thêm mới stored procedure thì tool command line của SubSonic cần chạy lại để cập nhật ánh xạ. Ngoài ra lập trình viên có thể sử dụng partial class để thêm mới các method cho các class tương ứng với bảng trong CSDL. Mình rất thích tính năng này của SubSonic bởi không phải lo truyền sai tham số vào stored procedure.

Về tốc độ, mình nghĩ SubSonic và nHibernate không khác nhau nhiều. Nhưng về dễ sử dụng thì mình thích SubSonic hơn.

LINQ thì có nhiều điểm cải tiến hơn là ORM thuần tuý. LINQ có thể truy vấn cho .NET collection, XML, và SQL,… Căn bản bên trong của LINQ tận dụng những cú pháp mới trong C# 3.0:

- Hàm mở rộng, extension method, gắn hàm mới vào đối tượng kể cả kiểu cơ bản như int mà không cần định nghĩa hàm thừa kế. Hàm này phải khai báo là pubic static nhé

- Biểu thức Lamba, lambda expression, cách viết mới của delegate inline function.

Tốc độ thì cả 3 công nghệ trên khi đo đạc cá nhân sử dụng kiến trúc client-server đều không thể nhanh bằng viết lời gọi đến stored procedure. Tuy nhiên, khả năng mở rộng, phân tán các tập đối tượng, objection collection giữa các máy tính trong kiến trúc SOA rõ ràng là dễ dàng hơn so với Client Server ngày xưa.

Hơn nữa khi nói đến tốc độ, chúng ta phải bàn đến cả khả năng chịu tải truy cập, load balancing & scalability. Một câu lệnh SQL chạy rất nhanh khi chỉ có duy nhất yêu cầu query thì chưa chắc đã đủ. Thực tế nhiều khi là hàng nghìn yêu cầu query đến cùng một lúc. Lúc này, cần phải tính tới phân tải database server hoặc cache dữ liệu trên nhiều application logic tier trung gian. Khi đó LINQ hay ActiveRecord sẽ phát huy sở trưởng của mình.

Với LINQ chỉ cần học một cú pháp, có thể truy vấn nhiều nguồn dữ liệu khác nhau. Chúng ta có thể mở rộng cả cú pháp LINQ viết thêm các hàm deffered và non differed function mới khi chúng ta có kinh nghiệm với hàm mở rộng và biểu thức lamba. Riêng cái này thì ANSI SQL bó tay rồi.

Happy Coding!

Comments

# re: So sánh nhanh giữa SubSonic, nHibernate và LINQ

Sunday, April 05, 2009 5:38 PM by hoangyeucon2009

anh cho em hỏi khi thiết kế web bằng asp.net nếu ta lạm dụng các control asp.net thì tốc độ thực thi sẽ chậm hơn nếu ta dùng các control thuần html.có đúng như vậy không anh?

# re: So sánh nhanh giữa SubSonic, nHibernate và LINQ

Monday, April 06, 2009 8:53 PM by Trinh Minh Cuong

Bạn tham khảo ở đây để thêm thông tin về sự khác biệt nhé

www.extremeexperts.com/.../DiffBetweenServerandHTMLControls.aspx

Cuong

# re: So sánh nhanh giữa SubSonic, nHibernate và LINQ

Tuesday, April 07, 2009 3:30 PM by Vinh Huynh

Cám ơn anh Cường nhiều nha. Tiện đây em hỏi luôn, em đang rất khó khăn với việc chọn và thiết kế mẫu 1 kiến trúc phát triễn các hệ thống web (các ứng dụng web thông thường, không có yếu tố chuyên biệt). Nếu có thể, anh viết 1 bài giới thiệu về AJAX, ASP.NET, ASP.NET AJAX, ASP.NET MVC? Tương lai của những công nghệ này như thế nào?

Em đặc biệt không thích viết javascript vì khó quản lý source, khó debug, khó tracing,... Nhưng nghe nói dùng javascript là cách tốt nhất (JQuery chẳng hạn). Vậy kiến trúc bên trong của những công nghệ trên (trừ silver light) có dùng javascript không?

# re: So sánh nhanh giữa SubSonic, nHibernate và LINQ

Tuesday, April 07, 2009 11:45 PM by Trinh Minh Cuong

Câu hỏi của bạn rất thú vị. Cho mình chút thời gian suy nghĩ , thực hành thấu đáo hơn một chút rồi mình trả lời nhé.

# re: So sánh nhanh giữa SubSonic, nHibernate và LINQ

Monday, May 11, 2009 11:10 AM by Nguyen Ba Quang

NHibernate cũng có tool để tự động generate ra classes và mapping files anh ạh. Hỗ trợ cả SQL và Oracle. Ngoài ra NHibernate cũng support LINQ, khá là hay. Tất nhiên LINQ thì thật tuyệt vời, tuy nhiên, nếu Microsoft phát triển thêm LINQ để hỗ trợ cho Oracle thì không còn gì bằng

# re: So sánh nhanh giữa SubSonic, nHibernate và LINQ

Monday, May 25, 2009 3:54 PM by t800t8

NHibernate ko hề dựa trên Active Record pattern. Nếu bạn xem lại Active Record pattern thì sẽ thấy một class được áp dụng Active Record pattern sẽ có các method để CRUD. Trong khi CRUD trong NHibernate thông qua ISession.

Còn đem so sánh SubSonic và NHibernate với LINQ thì hơi khập khiễng vì LINQ chỉ dùng để query thôi.

# re: So sánh nhanh giữa SubSonic, nHibernate và LINQ

Monday, April 18, 2011 2:53 PM by Ngô Thanh Tùng

Ở đây chắc anh Cường nói là LINQ to SQl (dbml). Còn mình thấy Entities Framework hay + có tính chính quy cao. Sách cũng nhiều. Mình vote EF.

# re: So sánh nhanh giữa SubSonic, nHibernate và LINQ

Monday, April 18, 2011 3:04 PM by Ngô Thanh Tùng

Mình có xem qua SubSonic thì thấy SubSonic hay, cái nhiều tiện ích, nhưng tính chính quy không cao, sách không nhiều -> khó khăn cho các bạn mới tiếp cận. Ở đây ai là FAN của SubSonic thì cho vài bài PR để anh em có nhiều thông tin hơn về SubSonic. Thanks!