Lợi ích của việc sử dụng trừu tượng hóa cơ sở dữ liệu bằng ORM là gì? [đóng cửa]


19

Tôi bắt đầu sử dụng ORM được đề xuất bởi khung mà tôi chọn, và mặc dù tôi thích ý tưởng về lớp trừu tượng được thêm vào mà ORM cung cấp, tôi bắt đầu nhận ra điều này thực sự có nghĩa là gì. Điều đó có nghĩa là tôi không còn làm việc với cơ sở dữ liệu của mình (mysql) và mọi tính năng dành riêng cho mysql đã biến mất, ngoài cửa sổ, giống như chúng không tồn tại.

Ý tưởng mà ORM có là nó đang cố gắng giúp tôi bằng cách biến mọi thứ thành cơ sở dữ liệu. Điều này nghe có vẻ tuyệt vời, nhưng thường có một lý do tại sao tôi chọn một hệ thống cơ sở dữ liệu cụ thể. Nhưng bằng cách đi theo lộ trình bất khả tri của cơ sở dữ liệu, ORM lấy mẫu số chung thấp nhất, có nghĩa là tôi kết thúc với bộ tính năng nhỏ nhất (những tính năng được hỗ trợ bởi tất cả các cơ sở dữ liệu).

Điều gì sẽ xảy ra nếu tôi biết rằng về lâu dài tôi sẽ không chuyển đổi cơ sở dữ liệu cơ bản? Tại sao không truy cập các tính năng cụ thể của cơ sở dữ liệu, quá?


2
+1: Rất thú vị. Nói chung, tôi là người đề xuất ORM, nhưng tôi thường coi RDBMS là bằng nhau (mà gần đây tôi đã bắt đầu thấy là sai).
Steven Evers

Có vẻ như bạn chỉ muốn xác nhận ý kiến ​​của riêng bạn; một blog có thể phù hợp với bạn tốt hơn một trang web hỏi đáp.

Bạn có thể không cần bất cứ điều gì nhiều hơn những gì ORM cung cấp. Bạn chỉ muốn lưu trữ dữ liệu đối tượng của mình trong cơ sở dữ liệu và đó là những gì ORM sẽ làm. Bạn không cần bất kỳ 'tính năng' nào khác.
CJ7

Câu trả lời:


14

Tôi thấy nó theo cùng một cách. Bất kỳ sự trừu tượng hóa nào không cho phép bạn có được bên dưới nó khi cần thiết là xấu xa, bởi vì nó dẫn đến tất cả các loại đảo ngược trừu tượng xấu xí trong mã của bạn.

Tại nơi làm việc, chúng tôi có một ORM tại nhà hoạt động khá tốt, nhưng trong thời gian chúng tôi cần một thứ gì đó mà các tính năng của nó không cung cấp rõ ràng, có một phương pháp lấy một chuỗi và thả nó trực tiếp vào truy vấn mà nó tạo ra, cho phép để sử dụng SQL thô khi cần thiết.

IMO bất kỳ ORM nào không có tính năng này không xứng đáng với các bit được biên dịch từ đó.


drops it directly into the query it's generatingNghe có vẻ thú vị. Bạn có biết bạn mất bao lâu để viết ORM cây nhà này không? Tôi muốn thấy một cái gì đó như thế này trong một trong những ORM nguồn mở ngoài kia.
jblue

+1. Làm việc với khía cạnh quan trọng nhất của ứng dụng (dữ liệu) của tôi là điều cuối cùng tôi muốn trừu tượng hóa và mất kết nối.
Fosco

1
Tôi thích có thể lặn dưới khi cần thiết, miễn là việc lặn dưới đó liên quan đến việc vượt qua một hàng rào ẩn dụ: "Đây là những con rồng. Hãy theo dõi bước của bạn."
Frank Shearar

1
@Jblue: Không có ý kiến. Tất cả đã được viết từ nhiều năm trước, rất lâu trước khi tôi được thuê. Họ thiết lập ORM trước khi bất kỳ ai sử dụng thuật ngữ này. Nó thường chỉ được gọi là "Mô hình đối tượng" trong cơ sở mã của chúng tôi.
Mason Wheeler

3
Tôi đồng ý. Đối với các ORM cơ bản và thông thường là rất hữu ích. Nhưng đôi khi bạn cần đi sâu hơn một chút và nếu ORM không cung cấp khả năng đó, thì đó là một vấn đề nữa cho bạn.
Nikos Steiakakis

14

ORM lấy mẫu số chung thấp nhất

Tôi phải không đồng ý với tuyên bố của bạn. Tôi sẽ lấy nHibernate làm ví dụ. Khung này hỗ trợ rất nhiều cơ sở dữ liệu, bao gồm cả những cơ sở dữ liệu phổ biến nhất, bất kể phiên bản (và các tính năng được hỗ trợ), giống như hầu hết các ORM.

Ghi chú nhanh: bạn chỉ đề cập đến sự trừu tượng hóa cơ sở dữ liệu. Đó là một trong nhiều lợi ích, nhưng tôi thực sự nghĩ rằng các tính năng hướng đối tượng mạnh hơn (ví dụ: kế thừa). Và You design your domain model first...

... Trở lại sự trừu tượng. Nó không phải là mẫu số chung thấp nhất. Trong nHibernate , bạn có phương ngữ. Nó cho phép bạn sử dụng cùng một mã để truy vấn các cơ sở dữ liệu khác nhau. Phương ngữ chăm sóc quản lý tính năng cho bạn. Phát biểu đúng là như vậy a given dialect will try to use all the power of a given database system.

Như một ví dụ điển hình SqlServer2005, khi được giới thiệu, đã tận dụng các tính năng phân trang mới của SQL Server 2005. Sử dụng phương ngữ đó thay vì SqlServer2000chỉ tăng hiệu suất của bạn.

Tất nhiên cũng có trường hợp ngoại lệ, nhưng tôi đã không gặp phải một trường hợp nào trong nhiều năm làm việc với nHibernate và các ứng dụng của tôi rất tập trung vào dữ liệu.


+1 để ủng hộ NHibernate. Một chút của một đường cong học tập so với các ORM khác, nhưng nỗ lực là hoàn toàn xứng đáng.
richeym

1
Tôi muốn nghe từ một số DBA về điều này. Ở công việc cuối cùng của tôi, Hibernate không có gì ngoài rắc rối (SQL mà nó tạo ra hoàn toàn kinh tởm.)
Fosco

+1 cho nhận xét này. Đó là tại chỗ. Khi bạn bắt đầu so sánh sức mạnh của một ORM tốt như nHibernate (với bộ nhớ đệm, tải chậm, v.v.) thì bạn sẽ thấy tại sao sự trừu tượng này tốt và tại sao nhu cầu cụ thể của cơ sở dữ liệu của bạn lại ít quan trọng hơn.
Chris Holmes

1
Fosco, cho nHibernate một cơ hội khác. Giống như bất kỳ Technoloy khác, bạn phải hiểu những gì đang xảy ra bên trong, để sử dụng nó đúng cách.

+1, ORM là giao điểm tối đa của những gì Java có thể làm với những gì trình điều khiển JDBC cụ thể có thể làm. Bạn được tự do chọn số tiền đầu tư bạn muốn thực hiện trong lớp liên tục của ứng dụng của mình
bobah

5

Ý tưởng rất gọn gàng, nhưng tôi chưa bao giờ được chuyển sang sử dụng công cụ ORM. Nó không phải là vấn đề đối với tôi để tự viết SQL (hoặc xử lý bất kỳ lưu trữ nào được sử dụng). Nhưng, tôi có sự thoải mái khi làm việc với số lượng dự án nhỏ hơn với tuổi thọ sản phẩm dài hơn, do đó, một khi thao tác SQL và DB được mã hóa bằng tay được thực hiện, nó đã được thực hiện. Thêm vào đó, rõ ràng bạn có thể xử lý bất kỳ truy vấn SQL trực tiếp nào bạn cần mà không cần phải điều chỉnh quy trình của bạn theo cách suy nghĩ của công cụ ORM.

Vì vậy, tôi đoán các câu hỏi nên có trước khi bạn nhảy vào một:

Bạn có thực sự đạt được bất cứ điều gì từ việc sử dụng chúng? Đó là, bạn có tiết kiệm đủ số lượng nỗ lực bằng cách triển khai một công cụ ORM để làm cho nó đáng để sử dụng và để làm cho nó đáng để thêm một sự phức tạp thêm vào hệ thống của bạn không? (điều này đặc biệt đúng với các ứng dụng thương mại, trong đó 'phần bổ sung' hiện là một vectơ bổ sung cho các vấn đề hỗ trợ tiềm năng)

Và sau đó, lớp trừu tượng thêm có ảnh hưởng tiêu cực đến ứng dụng không? Nó sẽ chậm hơn SQL mã hóa, v.v.


5

O / RM đã bị chỉ trích thường xuyên. Ted Neward gọi nó là " Việt Nam của Khoa học Máy tính " vài năm trước. O / RM

bắt đầu tốt, trở nên phức tạp hơn khi thời gian trôi qua và trước khi kéo dài người dùng vào một cam kết không có điểm phân định rõ ràng, không có điều kiện thắng rõ ràng và không có chiến lược thoát rõ ràng.

Trừ khi bạn chỉ viết bản đồ ad-hoc của riêng bạn (đó là một giải pháp tốt trong nhiều trường hợp, như những người khác đã nói), bạn có thể xem xét các lựa chọn thay thế như sử dụng cơ sở dữ liệu không liên quan. Một số người nói rằng cơ sở dữ liệu đối tượng thực sự tốt hơn, các từ thông dụng khác được đề cập trong ngữ cảnh này là LINQ, Ruby và Hướng dẫn D. Tôi cho rằng, trái ngược với cơ sở dữ liệu quan hệ thực sự, có cơ sở dữ liệu đối tượng thực sự. Nhưng trong thực tế tôi thấy rằng mô hình hóa dữ liệu khái niệm - nghĩa là tìm ra, những đối tượng trong thế giới thực mà bạn muốn lưu trữ dữ liệu và cách các đối tượng này liên quan đến nhau - quan trọng hơn là tìm hiểu cách thể hiện mô hình khái niệm của bạn trong bất kỳ lập trình hoặc ngôn ngữ cơ sở dữ liệu.


2
Tuyệt vời đọc ở đó. Tôi đã đi vòng tròn trong sự nghiệp và đã nắm bắt lại mô hình quan hệ với thành công hoàn toàn.
Jé Queue

2
+1 @Xepoch - Tôi đã có một lần gần đây về re re: ORM - tại sao SQL bị bỏ rơi trong giá lạnh? Trừu tượng, chắc chắn - nhưng ORM dường như thúc đẩy ám ảnh SQL.
sunwukung

1
@sunwukung, không phải lúc nào tôi cũng đồng ý, nhưng hiện tại tôi tin rằng SQL nên được coi là lớp logic lớp 1, không chỉ là thứ được sử dụng làm giao thức dây.
Jé Queue

3

Cái gì thay thế?

Đây là một khái niệm thú vị. Bằng cách trừu tượng hóa các tính năng của cơ sở dữ liệu cơ bản, chúng tôi chắc chắn mất một số tính năng của việc triển khai cơ sở dữ liệu cụ thể. (Chúng ta có nên phụ thuộc vào các tính năng cơ sở dữ liệu cụ thể hay không là một đối số khác) Tôi đoán điều này có thể được giải quyết bằng các ORM dành riêng cho cơ sở dữ liệu cho phép bạn truy cập các tính năng cụ thể, nhưng điều đó có thể gây ra nhiều rắc rối hơn giá trị sai hướng.

Vào cuối ngày, bạn phải tự hỏi - cái gì thay thế?

Chúng ta có nên ngừng sử dụng ORM và quay lại viết tất cả các truy cập cơ sở dữ liệu không? Chắc chắn chúng tôi có thể mất quyền truy cập vào một vài tính năng cơ sở dữ liệu thông qua ORM, nhưng bạn luôn có thể truy cập những tính năng này bằng các kỹ thuật trường học cũ. Cuối cùng, lợi nhuận bạn đạt được trong năng suất hoàn toàn vượt trội hơn những nhược điểm.


Tôi sẽ đặt câu hỏi về sự cần thiết phải sử dụng một cơ sở dữ liệu hợp lý. Điều đó làm phiền tôi rằng mọi người ngay lập tức nhảy vào RDBMS ngay cả khi họ không phải là giải pháp phù hợp. Cơ sở dữ liệu đối tượng, ví dụ, cung cấp một giải pháp rất thanh lịch cho nhiều vấn đề. Họ có hoàn hảo không? Không, nhưng mọi người hiếm khi bận tâm để đánh giá chúng. Có một xu hướng đáng lo ngại là "Tôi cần lưu trữ dữ liệu, tôi sẽ sử dụng SQL!"
Matt Olenik

6
@Matt: RDBMS là công nghệ rất cố gắng và đã được chứng minh và hiểu rõ. Có rất nhiều người có kinh nghiệm với họ và số lượng lớn các công cụ của bên thứ ba. Từ quan điểm của doanh nghiệp, có rất nhiều giá trị trong đó khi bạn xử lý một thứ cực kỳ có giá trị như dữ liệu của bạn. Đối với các dự án nhỏ hơn, vẫn có giá trị để có thể bắt đầu một dự án (như dịch vụ web LAMP) và có hầu hết các phần mềm ngay tại đó và được ghi chép đầy đủ.
David Thornley

3

Một ORM về cơ bản lên tới " Các thủ tục chưa được bảo vệ ". Ở đó, tôi đặt ra một thuật ngữ.

Mọi thứ ORM làm, bạn có thể sao chép với Lượt xem, Kích hoạt và Thủ tục lưu trữ. Chúng giúp trừu tượng hóa SQL thô và có thể giữ cho các cơ sở dữ liệu được chuẩn hóa nhất quán. Nhưng nó chỉ hoạt động tốt cho các trường hợp đơn giản. Nếu có quá nhiều dữ liệu mach để xử lý, chúng có thể trở thành một cống hiệu suất. (Các ORM trong PHP thường có phía tập lệnh dữ liệu, vì các chuỗi trình tạo SQL không thể trừu tượng hóa mọi thứ.)

Nhưng như thường lệ, tất cả phụ thuộc vào ứng dụng và nhiệm vụ trong tay.


2
"Các thủ tục chưa được bảo vệ" - thuật ngữ thích hợp là "SQL được tham số hóa". Bạn chỉ đang xem xét sơ bộ về những gì một ORM trưởng thành có thể làm cho bạn (theo
đợt

@richeym: Hầu hết các ORM trong PHP không sử dụng các câu lệnh được chuẩn bị, cũng như các trình giữ chỗ được tham số hóa. Đó là SQL thoát và nối tất cả các cách. Chắc chắn rằng họ cung cấp các lợi thế cấp cao hơn so với các truy vấn SQL thủ công tẻ nhạt. Tuy nhiên, về mặt lý thuyết, họ đưa logic xử lý ra khỏi cơ sở dữ liệu, do đó "các thủ tục chưa được bảo vệ".
mario

3

Một điều gây tổn thương khi sử dụng ORM là nhiều người hâm mộ của họ có xu hướng tuyên bố rằng chúng tôi không còn cần phải biết lý thuyết SQL và RDB. Các kết quả khác nhau từ hài hước đến thảm khốc hoàn toàn. Và điều này bất chấp hàng triệu lần ORM 'sản xuất và đánh giá rằng chúng ta phải biết rõ lý thuyết SQL và RDB để sử dụng và định cấu hình ORM đúng cách.

Tại sao mọi người sử dụng một công cụ có công dụng của nó trên nhiều, nhưng không phải tất cả các bối cảnh thành một viên đạn bạc có thể áp dụng phổ biến đều nằm ngoài tôi.


1

Năm ngoái tôi đã làm việc trên một ứng dụng nội bộ thay đổi thường xuyên và tôi rất vui khi chúng tôi sử dụng ORM. Ứng dụng này là một ứng dụng hỗ trợ cho nhóm quản lý thay đổi và khi dự án lớn hơn phát triển, ứng dụng nhỏ của chúng tôi có các yêu cầu mới cho các tình huống không tồn tại và không thể lường trước được vài tháng trước.

Nhờ ORM ( Propel , trong PHP), chúng tôi đã phân tách một số logic cho mã, do đó, một hàm đã thêm phần "là bản ghi hợp lệ" của truy vấn, một phần bảo mật khác ("chỉ hiển thị các bản ghi này nếu người dùng có các khả năng này "), ... Nếu cấu trúc cơ bản thay đổi (một trường bổ sung cần được xem xét cho" tính hợp lệ của bản ghi "), chúng tôi chỉ phải thay đổi một hàm, không phải hai mươi mệnh đề SQL.

Chúng tôi xuất phát từ một tình huống mà tất cả các mệnh đề SQL (tốt, hầu hết) được lưu trữ trong một tệp XML riêng biệt, vì vậy "các thay đổi cơ sở dữ liệu sẽ dễ xử lý". Hãy tin tôi, họ đã không. Một phần kinh khủng đến nỗi tôi phải gửi nó cho The Daily WTF .

Nếu một truy vấn quá phức tạp để thể hiện với Tiêu chí Propel hoặc chúng tôi cần một số tính năng dành riêng cho nhà cung cấp (chủ yếu là tìm kiếm toàn văn bản, vì chúng tôi đang sử dụng MySQL), thì điều này không có vấn đề gì với Propel. Bạn có thể thêm tiêu chí tùy chỉnh hoặc khi thực sự cần thiết, chúng tôi đã sử dụng SQL thô ( giờ đây thậm chí còn dễ dàng hơn để kết hợp với các đối tượng Propel thực tế). Bạn có thể dễ dàng thêm các tiện ích bổ sung dành riêng cho nhà cung cấp của mình vào các lớp được tạo, để bạn có cả hai thế giới tốt nhất: không có SQL trong mã ứng dụng của bạn, nhưng với tất cả các khả năng của công cụ cơ sở dữ liệu của bạn.


1

Nhưng vấn đề là bạn phải lập trình ra khỏi cơ sở dữ liệu, nghĩa là bạn không cần phải nghĩ như bạn đang ở trong cơ sở dữ liệu.

Bây giờ tôi làm việc trong C # và sử dụng LINQ rất nhiều, rất nhiều phương pháp lưu loát. Tôi không cần phải suy nghĩ về cách các đối tượng của tôi được lưu trữ hoặc tìm thấy, hoặc thậm chí được lưu ở cấp chương trình và rất ít ở cấp độ doanh nghiệp.

Thông thường các phương thức được cung cấp bởi chính Cơ sở dữ liệu cụ thể được sử dụng trong Trình kết nối DB, do đó bạn có được những tối ưu hóa đó mà không cần biết chúng là gì.

Bạn vẫn có thể viết các hàm DB. Thường thì bạn chỉ có thể ánh xạ chúng qua.

Và trên hết, việc phân tách như thế cho phép kiểm tra và buộc bạn (một chút) viết mã có cấu trúc tốt hơn


2
Một lần nữa, tại sao bạn cần lập trình ra khỏi cơ sở dữ liệu? Tại sao không biến cơ sở dữ liệu thành một phần không thể thiếu trong quá trình phát triển của bạn khi bạn đã chọn sử dụng một cơ sở dữ liệu ở nơi đầu tiên. Nếu bạn không cần RDBMS, tại sao lại đưa ORM lên trên nó?
Jé Queue

1
Nó là một phần không thể thiếu. Một cơ sở dữ liệu làm rất tốt trong việc duy trì và thực thi các mối quan hệ và lấy dữ liệu thô. Tuy nhiên, những điều bạn muốn làm với dữ liệu này rất có thể đã được xử lý trong trình bao bọc ORM. Và bên cạnh những điều quan trọng, tại sao lại đưa logic ra khỏi tầng lớp kinh doanh?
burnt_hand

@burnt_hand - "Nhưng vấn đề là bạn phải lập trình ra khỏi cơ sở dữ liệu, nghĩa là bạn không cần phải suy nghĩ như bạn đang ở trong cơ sở dữ liệu." Những lợi thế phổ quát là gì? Tôi có thể xem nó như một lợi thế khi ứng dụng của bạn chỉ đơn giản là tìm cách để duy trì các đối tượng. Nhưng đối với dữ liệu quan hệ, OLTP và tương tự, lập trình ra khỏi cơ sở dữ liệu là một cách để bạn tự làm khó mình.
luis.espinal

@ luis.espinal - Điều gì có nghĩa là làm hỏng thời gian lớn của bạn? Tôi thực sự tò mò. Bạn có một ví dụ?
burnt_hand

@burnt_hand - thực sự tôi có một vài ví dụ thực tế. Hầu hết gần đây liên quan đến một mô hình miền rất lớn và vì vấn đề hiệu suất, dự án phải tải lên tất cả các ánh xạ ngủ đông khi khởi động. Nhà máy phiên kết quả cuối cùng đã ăn tới 30% bộ nhớ đã sử dụng ... chỉ cho các ràng buộc. Cơ sở mã hiện đã quá cam kết với ORM và không thể viết lại. Điều này bây giờ có ý nghĩa thực tế kể từ khi ứng dụng đang tiến đến giới hạn vật lý trên phần cứng mà nó được cho là chạy. Bummer.
luis.espinal

1

ORMs có thể cung cấp cho bạn truy cập vào cơ sở dữ liệu cụ thể các tính năng là tốt, nó phụ thuộc vào ORM bạn đang sử dụng và những tính năng nó cung cấp.

Ví dụ, trong dự án hiện tại tôi đang làm việc, chúng tôi đang sử dụng API liên tục Java và Hibernate. Mặc dù vậy, chúng tôi sử dụng một số tính năng cụ thể của cơ sở dữ liệu, chẳng hạn như tìm kiếm trong các bảng có soundex.

Đối với tôi, lợi ích chính của việc sử dụng ORM không nhất thiết là nó làm cho cơ sở dữ liệu ứng dụng trở nên bất khả tri (mặc dù đó cũng là một điều tốt), nhưng phần lớn tôi không phải suy nghĩ về cách mọi thứ được lưu trữ và lấy lại.

Tuy nhiên , đến một lúc nào đó bạn rất có thể phải suy nghĩ về điều này bằng mọi cách, tùy thuộc vào yêu cầu cho ứng dụng của bạn. ORM không phải là phép thuật.


1

Tôi đã viết riêng của mình để giúp tôi chọn và chèn dễ dàng hơn.

Evey db điều cụ thể có sẵn. Tôi chỉ cần tự viết truy vấn mà thư viện hỗ trợ cho tôi (tôi có thể sử dụng '?' Và params thay vì tự đặt tên cho một tham số và sử dụng .Add)

Tôi đoán một nửa của tôi hút một nửa hữu ích. Tôi nhận được một số trợ giúp trong thế giới ORM và thực hiện các phần quan trọng trong thế giới truy vấn.


1

Viết mã để chèn và chọn, cập nhật nội tuyến hoặc với các procs được lưu trữ và ánh xạ chúng trở lại thông qua DAL là tiêu chuẩn dài hơn thay vì chỉ có lợi trong trường hợp ngoại lệ. Các ORM có sẵn, cơ sở dữ liệu hỗ trợ và ngôn ngữ câu hỏi bạn nên hỏi tại sao bạn không sử dụng ORM?

Chúng được tiêu chuẩn hóa, phổ quát, hoặc được chỉ định hoặc chung chung. hơn nữa nó nhanh hơn và dễ thực hiện hơn Tôi đã sử dụng cận âm, linq-to-sql và khung thực thể. Nó cho phép nhà phát triển tập trung vào logic và các quy tắc kinh doanh thay vì ánh xạ cơ sở dữ liệu.


1
Có rất nhiều lý do để sử dụng hoặc KHÔNG sử dụng ORM. ORM không phải là thuốc chữa bách bệnh và rất ít người thực sự biết cách sử dụng chúng một cách hiệu quả. Hơn nữa, trong nhiều trường hợp, logic nghiệp vụ đã được phản ánh (một phần) theo cách rất tự nhiên trong các mối quan hệ đã tồn tại trong RDBMS (đây là kịch bản phổ biến nhất mà tôi gặp phải, quá khứ và hiện tại). Một RDBM được thiết kế tốt có nền tảng toán học mạnh mẽ, được hiểu rõ, đã thử và đúng. Tất nhiên, không phải mọi thứ nên được mô hình hóa bằng RDMB, nhưng cũng như vậy, ORM cũng không phải là một giải pháp phổ quát.
luis.espinal

1

Hai xu của tôi (đơn giản):

1: Có ORMS và có ORMS. Một số ORMS dựa trên Active Record, một số khác dựa trên Data Mapper - bản thân nó là một sự cân nhắc có liên quan, nhưng một yêu cầu một số điều tra để hiểu được ý nghĩa. Nói chung - kinh nghiệm của tôi về PHP là ORMS hỗ trợ cái trước, ít cái nào hỗ trợ cái sau. Các ORM dựa trên Bản ghi hoạt động dường như có một trong hai hiệu ứng - chúng hoặc không chuẩn hóa cơ sở dữ liệu hoặc gọi rất nhiều lớp để hỗ trợ các tương tác đối tượng.

2: Ưu điểm của ORM giảm dần trong mối tương quan trực tiếp đến mức độ phức tạp của truy vấn bạn cần chạy. Khi bạn có một mối quan hệ đơn giản tốt đẹp - tức là Người dùng -> Bài đăng, họ có thể làm việc rất tốt. Điều này (IMO) là lý do tại sao hầu hết các ORM / khung sử dụng các ví dụ như thế này. Tuy nhiên, khi bạn cần chạy các truy vấn phức tạp, lượng ORMQL bạn cần tạo tương đương với độ dài chuỗi của truy vấn SQL thông thường - nhưng ít hiệu suất hơn do biểu đồ đối tượng chạy truy vấn, loại này đánh bại điểm của trừu tượng hóa. Vì vậy, một cách ngắn gọn - ORM là tuyệt vời cho 30-50% nhiệm vụ cơ sở dữ liệu đầu tiên của bạn - nhưng khủng khiếp cho lần cuối. Tôi nghĩ rằng đây là một lý do tại sao AR rất phổ biến.

3: Tại sao phải ẩn khỏi cơ sở dữ liệu? Bạn có sử dụng ngôn ngữ phía máy chủ để trừu tượng javascript không?

Cá nhân tôi trộn các cách tiếp cận đó:

  • sử dụng ORM cho những điều cơ bản, tải "người dùng"
  • sử dụng một DAO có chứa một số truy vấn SQL được nướng sẵn (ví dụ: selectLike, selectWhere).
  • mở rộng DAO khi cần thiết để thêm các truy vấn tùy chỉnh cụ thể hơn nhưng có thể sử dụng lại
  • Cung cấp quyền truy cập cơ sở dữ liệu đơn giản thông qua truy vấn DAO - tức là $ data = Dao-> (chuỗi sql của bạn) để thực hiện một truy vấn tắt.

Đã nói tất cả, Doctrine 2 sắp ra mắt, trông thật sự thú vị.


0

Bạn có thể sử dụng các khung công cụ ánh xạ SQL như myBatis nếu bạn muốn sử dụng các tính năng sql.


Đó thực sự không phải là một câu trả lời cho câu hỏi của jblue về lợi ích của việc sử dụng một người lập bản đồ như vậy
Lukas Eder
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.