Dùng ORM khi nào ?

175 views
Skip to first unread message

Huy

unread,
Aug 5, 2007, 8:11:02 AM8/5/07
to PHPVietnam
Active Record, Data Mapper, Table Data Gateway, Row Data Gateway.

Các pattern trên nên dùng khi nào và không nên dùng khi nào ?
Các PHP framework ngày nay đều implement các pattern trên, Cake,
symfony, Solar, Zend Framework... cho đến cả PRADO. Hoặc có cả những
ORM framework đứng riêng một mình như PHPDoctrine, Propel ...

Vấn đề ở đây là sử dụng ORM để phát triển các ứng dụng web có hợp lý
không ?

Tôi thường thấy trong manual, tutorial về các framework trên, hoặc
thậm chí là trong các ứng dụng mã mở được phát triển từ chúng, ORM
được sử dụng trong mọi trường hợp, kể cả read-only query (ví dụ chỉ
query dữ liệu trong DB ra để show hàng).

Theo quan điểm của tôi, ORM chỉ nên được sử dụng trong các trường hợp
cần sự update hoặc insert vào DB, tức là select-to-update, hay insert.
Hoặc trong phần quản trị nội dung của ứng dụng.

Việc sử dụng ORM trong read-only tất nhiên sẽ làm ứng dụng chậm xuống,
tốn nhiều memory cho việc xử lý các tác vụ không cần thiết. Thay vì
chỉ đơn giản là lấy dữ liệu ra và show hàng, các ORM sẽ phải quan tâm
các mối quan hệ giữa các object, validate ...

Ý kiến của các bạn, các anh chị về vấn đề này ?

An Vu

unread,
Aug 5, 2007, 9:29:35 PM8/5/07
to phpvi...@googlegroups.com
On 8/5/07, Huy <vnsu...@gmail.com> wrote:
> Active Record, Data Mapper, Table Data Gateway, Row Data Gateway.
>
> Các pattern trên nên dùng khi nào và không nên dùng khi nào ?
> Các PHP framework ngày nay đều implement các pattern trên, Cake,
> symfony, Solar, Zend Framework... cho đến cả PRADO. Hoặc có cả những
> ORM framework đứng riêng một mình như PHPDoctrine, Propel ...
>
> Vấn đề ở đây là sử dụng ORM để phát triển các ứng dụng web có hợp lý
> không ?
>

Nếu ko hợp lý thì người ta phát triển ORM để làm gì?

> Tôi thường thấy trong manual, tutorial về các framework trên, hoặc
> thậm chí là trong các ứng dụng mã mở được phát triển từ chúng, ORM
> được sử dụng trong mọi trường hợp, kể cả read-only query (ví dụ chỉ
> query dữ liệu trong DB ra để show hàng).
>
> Theo quan điểm của tôi, ORM chỉ nên được sử dụng trong các trường hợp
> cần sự update hoặc insert vào DB, tức là select-to-update, hay insert.
> Hoặc trong phần quản trị nội dung của ứng dụng.
>
> Việc sử dụng ORM trong read-only tất nhiên sẽ làm ứng dụng chậm xuống,
> tốn nhiều memory cho việc xử lý các tác vụ không cần thiết. Thay vì
> chỉ đơn giản là lấy dữ liệu ra và show hàng, các ORM sẽ phải quan tâm
> các mối quan hệ giữa các object, validate ...
>
> Ý kiến của các bạn, các anh chị về vấn đề này ?
>

Bạn có thể xem mã nguồn của của từng loại ORM hoặc mã do ORM generate
ra để biết nó có kiểm tra mối quan hệ hay validate hay không. Cá nhân
tôi cho rằng việc xác định các mối quan hệ giữa các table không có lí
do gì phải thực hiện lúc thực thi query mà nó đã đc xác định lúc
generate ra mã. Chuyện validate thì những loại ORM mà tôi biết ko hề
validate trước khi thực hiện câu truy vấn

Huy

unread,
Aug 5, 2007, 10:10:13 PM8/5/07
to PHPVietnam
Cái đó tôi chỉ liệt kê ra như thế thôi có "..." mà.
Tôi xem qua gần hết rồi. Từ Doctrine, Propel, Zend Db Table, Row, thậm
chí cả mã nguồn C++ của SDO luôn. Tôi chắc chắn việc select bằng các
ORM sẽ ngốn resource gấp đôi gấp 3 so với cách query thông thường
(buffered, chưa nói đến unbuffered). Với Zend Table thì đơn giản hơn
nhưng nó sẽ thực hiện việc describle table trước tiên.

Với Doctrine và Propel, chúng sẽ fetch all, duyệt qua kết quả query để
tạo object. Nếu select 2 table thì chắc chắn sẽ lặp thêm một vòng nữa
để tạo mối quan hệ giữa các object.
Với SDO thì còn khủng khiếp hơn nữa (phần duyệt đó viết bằng PHP).
Vậy, nếu dùng ORM, ví dụ để show ra danh sách khách hàng chẳng hạn,
bạn phải duyệt qua danh sách kết quả 2 lần (chỉ nói trên phạm vi mã
PHP của bạn, chưa nói đến mức thấp hơn): ở ORM và ở View !
Thử hỏi như thế có cần thiết ?

Tạm thời bỏ qua những cái đó. Các ORM cũng sẽ query toàn bộ các field
(*) vì như thế mới tạo được object.

Ví dụ bạn muốn query join 4,5 table, mỗi table có mười mất field nhưng
bạn chỉ cần lấy 2 field ở table đầu tiên, order, limit ... ORM có đáp
ứng được cho bạn không ?

On Aug 6, 8:29 am, "An Vu" <a...@toan2.com> wrote:

An Vu

unread,
Aug 6, 2007, 12:24:31 AM8/6/07
to phpvi...@googlegroups.com
> Ví dụ bạn muốn query join 4,5 table, mỗi table có mười mất field nhưng
> bạn chỉ cần lấy 2 field ở table đầu tiên, order, limit ... ORM có đáp
> ứng được cho bạn không ?
>

Tôi nghĩ bạn có thể dùng ORM hoặc tự xây dựng câu truy vấn riêng trong
từng trường hợp cụ thể. Khi dữ liệu lớn thì chỉ nên lấy những thứ cần
thiết để tăng tốc độ thực thi. Còn khi chỉ lấy 1 row thì xài ORM để
viết cho lẹ

P/S: mới xem lại propel manual, hoá ra nó cũng có phần validate

An Vu

unread,
Aug 6, 2007, 12:46:11 AM8/6/07
to phpvi...@googlegroups.com
trường hợp propel, có thể thiết lập $criteria->addSelectColumn() và
lấy dữ liệu về dưới dạng ResultSet, như vậy có thể tiết kiệm đc bộ nhớ
(tôi chưa kiểm tra addSelectColumn có work hay không)
Reply all
Reply to author
Forward
0 new messages