ORM có phải là một mẫu chống? [đóng cửa]


58

Tôi đã có một cuộc thảo luận rất kích thích và xen kẽ với một đồng nghiệp về ORM và những ưu và nhược điểm của nó. Theo tôi, một ORM chỉ hữu ích trong những trường hợp hiếm nhất. Ít nhất là trong kinh nghiệm của tôi.

Nhưng tôi không muốn liệt kê các lập luận của riêng mình tại thời điểm này. Vì vậy, tôi hỏi bạn, bạn nghĩ gì về ORM? Những ưu và nhược điểm là gì?


3
Bạn đã đọc cái này chưa: seldo.com/weblog/2011/08/11/orm_is_an_antipotype ?
Thất

2
Đúng. Trừ khi bạn có một ứng dụng CRUD chung không có giá trị gì với cơ sở dữ liệu trong trường hợp bạn không nên sử dụng cơ sở dữ liệu quan hệ.
Raynos

1
@derphil: Bạn có thể muốn làm cho nó bớt rộng hơn, nếu không điều này sẽ bị đóng. Nếu bạn tin rằng đó là một kiểu chống mẫu, có thể nói tại sao và sau đó hỏi trong trường hợp nào thì kiểu chống mẫu này phù hợp (nhưng điều đó vẫn có thể quá rộng).
Thất vọngWithFormsDesigner

2
@derphil, có rất nhiều phản biện trong các bình luận cho bài đăng trên blog đó, bạn đã đọc chúng chưa?
Péter Török

2
Và chỉ là một bằng chứng khác về lý do tại sao bạn không cần ORM: Medium.com/@wrong.about/you-dont-need-an-orm-7ef83bd1b37d
Zapadlo

Câu trả lời:


83

Có một tập hợp khá lớn và đa dạng về các khó khăn về khái niệm và kỹ thuật khi cố gắng tiếp cận cơ sở dữ liệu quan hệ từ góc độ hướng đối tượng. Những khó khăn này được gọi chung là sự không phù hợp trở kháng quan hệ đối tượngbài viết Wikipedia liên quan là rất nhiều thông tin. Bài viết xác định khá nhiều, tôi không thấy bất kỳ cách hợp lý nào để mô tả chúng ở đây. Chỉ cần cung cấp cho bạn một ý tưởng chung, chúng được phân loại thành:

  • Không phù hợp
    • Khái niệm hướng đối tượng
    • Sự khác biệt về kiểu dữ liệu
    • Sự khác biệt về cấu trúc và tính toàn vẹn
    • Thao tác khác biệt
    • Chênh lệch giao dịch
  • Giải quyết sự không phù hợp trở kháng
    • Tối thiểu hóa
    • Kiến trúc thay thế
    • Đền bù
  • Ganh đua
  • Sự khác biệt về triết học

Tôi nghĩ rằng nếu bạn dành thời gian để đọc bài viết, bạn sẽ hiểu rằng thực tế rằng ORM đôi khi được mô tả như là một mô hình chống thực tế là không thể tránh khỏi. Hai miền khác nhau đến mức mọi cách tiếp cận đối xử với nhau là mặc định là một mô hình chống, theo nghĩa là một mô hình chống là một mô hình đi ngược lại triết lý của một miền.

Nhưng tôi không nghĩ thuật ngữ này nên áp dụng cho bất kỳ thứ gì chủ yếu đóng vai trò là cầu nối giữa hai miền khác nhau. Dán nhãn một mẫu là chống mẫu chỉ có ý nghĩa trong miền của nó. Vì vậy, câu hỏi liệu nó có phải là một mô hình chống hay không là không liên quan.

Nhưng nó có hữu ích không? Có ORM là một trong những mô hình chống hữu ích nhất hiện có. Bạn sẽ hiểu tại sao chỉ khi bạn thấy mình trong một tình huống thực tế, nơi bạn sẽ phải trao đổi cơ sở dữ liệu trong một dự án. Hoặc thậm chí nâng cấp lên phiên bản khác của cùng một cơ sở dữ liệu. ORM là một trong những điều đó, mà bạn chỉ hiểu đầy đủ khi bạn thực sự cần chúng.

Dĩ nhiên, vì mọi thứ đều hữu ích, ORM rất dễ bị lạm dụng. Nếu bạn nghĩ rằng bằng cách nào đó thay thế nhu cầu biết mọi thứ về cơ sở dữ liệu bạn làm việc, thì nó sẽ quay lại và cắn bạn. Cứng.

Cuối cùng, hãy để tôi xấu hổ cắm một câu trả lời khác của mình vào câu hỏi liên quan "Mẫu ActiveRecord có tuân theo / khuyến khích các nguyên tắc thiết kế RẮN không?" câu hỏi, mà với tôi là một câu hỏi phù hợp hơn nhiều so với "nó là một mô hình chống".


5
+1 để làm việc trong cụm từ "không khớp trở kháng". Buzzwords cho các chuyên viên máy tính, nhưng tôi cũng thích chúng!
hardmath

Hoàn toàn đồng ý ... kiểm tra liên kết này rất tốt được giải thích: seldo.com/weblog/2011/08/11/orm_is_an_antipotype
sandino

42

Điều này giống như hỏi "một máy khoan điện có chống mẫu không?". Các ORM đã kiếm được một vị trí tốt trong hộp công cụ của tôi, giảm mã soạn sẵn của tôi và tôi vẫn có thể sử dụng SQL tùy chỉnh nếu cần. Vì vậy, nếu nó là một mô hình chống, nó đi ngược lại với mô hình nào?

Câu trả lời của tôi là không, có rất nhiều ORM trưởng thành ngoài kia giúp cuộc sống của bạn dễ dàng hơn rất nhiều và làm cho mã của bạn dễ hiểu hơn. Điều này theo bất kỳ cách nào có nghĩa là bạn không cần phải hiểu SQL, hoàn toàn ngược lại.


11
+1 Tôi cũng nghĩ nó rất hữu ích, có một đường cong học tập. Nhưng thật tuyệt khi không phải tự nhập pojos, v.v.
NimChimpsky 17/11/11

18

Tôi sẽ cố gắng gọi một cái gì đó là "chống mẫu", lần đầu tiên được gọi là mẫu của Martin Fowler và từ đó đã được chấp nhận trong gần như mọi ngôn ngữ lập trình hiện đại. (Xem bài viết Wikipedia trên ActiveRecord .)

Một ORM tốt có thể dẫn đến ít mã hơn (và ít lặp lại hơn nhiều) trong một dự án và không có gì tương quan mạnh với các lỗi như số lượng mã gốc.

Các ORM thường được thiết kế để xử lý các trường hợp sử dụng phổ biến nhất để làm việc với cơ sở dữ liệu. Các truy vấn phức tạp có thể vẫn cần được viết rõ ràng. Nhưng tôi mạnh mẽ không khuyến khích viết các truy vấn rõ ràng cho mọi tương tác cơ sở dữ liệu. Trong hầu hết các trường hợp, đó là một sự lãng phí thời gian.


12
"Tôi sẽ ngần ngại chống lại tranh luận bởi chính quyền"
Raynos

3
@Raynos: Ý bạn là ... bạn đang nói ... Fowler có thể đã .... SAU?!?! sốc và thở hổn hển ! Lộng ngôn !! : P;)
Thất vọngWithFormsDesigner

9
@Raynos - Có lẽ chính quyền không phải là đối số tốt nhất, nhưng OP đã nói "theo kinh nghiệm của tôi". Đây thực chất là một lời kêu gọi đối với thẩm quyền cá nhân, vì vậy tôi nghĩ thật hợp lý khi chống lại sự kháng cáo đối với chính quyền và sự đồng thuận. Bên cạnh đó, thuật ngữ "chống mẫu" là về ý kiến. Tôi đã đưa ra ví dụ về những gì người khác nghĩ.
Nathan Long

3
@NathanLong Tôi chỉ chỉ ra rằng sự phổ biến và tính chính xác là trực giao.
Raynos

1
FWIW Data Mapper có lẽ là mẫu ánh xạ gần nhất với ORM. ActiveRecord là một mô hình khác nhau, mặc dù chắc chắn có liên quan.
JasonTrue

11

Sử dụng ORM thay vì học SQL là một ý tưởng khá tồi. Nếu bạn không biết chính xác loại SQL được tạo, nếu bạn không hiểu các vấn đề N + 1 và cách tối ưu hóa thì chắc chắn nó sẽ gây hại nhiều hơn là có lợi. Mặc dù vậy, tôi cảm thấy rằng tôi làm việc hiệu quả hơn khi sử dụng ORM. Tôi thích Rails ActiveRecord, không cố gắng giả vờ rằng không có cơ sở dữ liệu và không cản trở bạn nếu bạn chỉ cần viết SQL. Tôi lo lắng mặc dù một số người có thể tin tưởng vào những thành ngữ họ thấy quá sâu sắc, không có sự hiểu biết sâu sắc về những gì họ đang làm.


11

Kinh nghiệm của tôi: Tôi đang sử dụng NHibernate với Linq2NHibernate.

Ưu điểm:

  • Nó được loại bỏ "Chuỗi ma thuật", hoặc ít nhất cung cấp một nơi duy nhất một lần duy nhất để đặt chúng
  • Nó cho phép tôi làm việc trong mô hình OO toàn bộ thời gian
  • Mã dễ đọc hơn
  • Mã được xây dựng trên đầu dễ thay đổi hơn
  • Nó cho phép bạn trao đổi cơ sở dữ liệu quan hệ thực tế của mình mà không cần duy trì 2 kho riêng biệt (hiếm khi được thực hiện, nhưng đó là một lợi ích lớn nếu bạn cần).

Nhược điểm:

  • Mã khó viết hơn , bởi vì
  • Nó không phải là một sự trừu tượng đầy đủ - bạn vẫn phải làm quen với những gì nó đang làm trong nền

Tôi sẽ nói rằng nó không tuân theo lời hứa mà hầu hết mọi người ban đầu hy vọng. Tôi sẽ không trách ai đó khi nói rằng đó là một kiểu chống đối. Trong trường hợp của tôi, tôi thấy rằng tôi vẫn cần thực hiện các kiểm tra tích hợp đối với cơ sở dữ liệu SQLite để đảm bảo rằng các truy vấn Linq2NHibernate của tôi thực sự hoạt động. Vì vậy, thực sự, nếu bạn đang thực hiện các bài kiểm tra tích hợp đối với cơ sở dữ liệu quan hệ thực sự, thì loại đó sẽ loại bỏ vấn đề với "chuỗi ma thuật".

Nếu tôi bắt đầu một dự án mới, tôi không chắc mình có sử dụng ORM hay không. Tôi có thể sẽ, nhưng tôi không thể nói chắc chắn bạn nên. Tôi muốn nói rằng nó giống như sự khác biệt giữa việc chọn C ++ hoặc Java / .NET cho dự án của bạn: bạn sẽ cần sự linh hoạt mà bạn có được khi làm việc ở cấp thấp hơn, hoặc bạn muốn làm việc ở cấp cao hơn và (được cho là) ​​sẽ nhiều hơn năng suất? Câu trả lời bình thường là làm việc ở mức cao như bạn có thể thoát khỏi . Điều đó thường có nghĩa là sử dụng ORM.


6

Điểm mạnh của ORM là nó cho phép bạn mô hình hóa hành vi ứng dụng bằng các kỹ thuật hướng đối tượng. Trong một thế giới được thiết kế cẩn thận, bạn có một lớp ứng dụng trong đó ngôn ngữ của doanh nghiệp đáp ứng gọn gàng ngôn ngữ của nhóm phát triển. ORM là một yếu tố hỗ trợ cho điều đó, nếu ORM được sử dụng hợp lý.

Điểm yếu là số người thực sự, thực sự có được lập trình hướng đối tượng là khá nhỏ. Rất nhiều người viết mì spaghetti và thịt viên, với các đối tượng được ghép nối cao, có ít hành vi của riêng họ và hành vi thực sự kết thúc trong các lớp "Dịch vụ" và "Người quản lý" đáng ghét, và mã đó thường bị gây rối khiến mọi người sợ hãi thay đổi nó bởi vì họ không thể tìm ra tác dụng phụ sẽ là gì.

Ngoài ra, rất nhiều người không thực sự có được mô hình quan hệ. Một ORM sẽ không giúp họ có được nó và nó sẽ không giúp họ bằng cách trừu tượng hóa mô hình quan hệ. Nó chỉ cho phép bạn tập trung vào lớp miền của bạn sớm và có được điều đó ngay trước khi bạn bắt đầu quá quan tâm đến thiết kế cơ sở dữ liệu. Nếu được áp dụng tốt, với sự trợ giúp của các công cụ di chuyển lược đồ hợp lý và ORM có thể giúp bạn ngăn ngừa nợ mã xây dựng.

Tôi đã xây dựng các ứng dụng trong đó ORM giữ mã ứng dụng đơn giản, dễ đọc và có thể kiểm tra và có hiệu suất hợp lý. Tôi cũng đã duy trì các ứng dụng trong đó mẫu bị sử dụng sai và mã bị sai lệch, không thể kiểm tra được, chậm và dễ vỡ; Hóa ra chính ORM đã làm rất ít với điều này, ngoại trừ việc thay vì viết mã xấu mô hình hóa miền ứng dụng kém, nhóm kỹ sư kế thừa đã viết mã xấu mô hình hóa miền ứng dụng kém và mã lớp dịch vụ tồi đã bỏ qua tất cả giá trị mà ORM của họ có thể cung cấp cho họ.

Các ORM sẽ không làm cho bạn thông minh hơn, nhưng trong tay của nhà phát triển phù hợp, có thể dẫn đến mã chất lượng cao hơn và dễ bảo trì hơn.


Tôi nghĩ điều này gây nhầm lẫn khi sử dụng ORM làm mẫu cho truy cập DB và ORM làm trình tạo mã ưa thích để giúp truy cập DB dễ dàng và tốt hơn.
gbjbaanb

Tôi không chắc ý của bạn là gì Nhận xét của bạn không có ý nghĩa nhiều với tôi.
JasonTrue

Trong đó, ORM tạo ra một cách tuyệt vời để truy cập DB với rất nhiều công việc khó khăn dành cho bạn, nhưng nếu bạn sử dụng nó như một mẫu thiết kế để giả vờ DB là một tập hợp các đối tượng, nó sẽ bắt đầu rơi xuống. Đó là những gì tôi nghĩ bạn đang nói.
gbjbaanb

Tôi không nghĩ rằng tôi đã từng ủng hộ việc sử dụng ORM để giả vờ rằng bạn có một cửa hàng vật thể ma thuật không yêu cầu bạn phải hiểu cách thức hoạt động của cơ sở dữ liệu. Tôi đã nói chính xác điều ngược lại: Nếu bạn hiểu rõ về lập trình hướng đối tượng VÀ cách thức hoạt động của cơ sở dữ liệu, một ORM có thể giúp bạn tạo ra nhiều mã có thể bảo trì hơn.
JasonTrue

5

Có lẽ câu trả lời nằm trong câu hỏi ngược của bạn: Việc lưu trữ dữ liệu ứng dụng của bạn trong một cái gì đó không phải là cơ sở dữ liệu quan hệ là một ý tưởng tốt? Những vấn đề bạn đang loại bỏ, và những vấn đề khác bạn sẽ nhận được? Bạn có thể sống mà không có khả năng dễ dàng tham chiếu chéo dữ liệu của mình (tham gia) hoặc nhanh chóng lọc ra các bản ghi bạn muốn dựa trên nhiều tiêu chí không? Bạn không cần hỗ trợ giao dịch vững chắc (giả sử thay thế của bạn không có nó)? Không phải tất cả các ứng dụng đều cần một kho lưu trữ dữ liệu luôn luôn nhất quán và đầy đủ.

Tôi nghĩ rằng mô hình chống thực sự ở đây có thể đang sử dụng DB quan hệ khi bạn không cần. Nếu bạn cần một cái, thì bạn cần ORM, và nó chắc chắn không phải là mẫu chống.


1
Dù tôi đồng ý rằng việc sử dụng cơ sở dữ liệu quan hệ nếu bạn không cần là một ý tưởng tồi, cho đến ngày nay nếu bạn sử dụng một cơ sở dữ liệu, bạn cần một ORM là lố bịch!
HLGEM

1
Ừm, vậy thì bạn sẽ lấy dữ liệu của mình vào và ra khỏi cơ sở dữ liệu như thế nào? Ở đâu đó, một cái gì đó sẽ phải ánh xạ các đối tượng của bạn đến cấu trúc quan hệ và tạo lại chúng khi chúng được đọc từ cơ sở dữ liệu. Ngay cả khi bạn viết tay các truy vấn và sao chép dữ liệu vào và ra khỏi tập kết quả, bạn vẫn đang thực hiện ORM.
TMN

1
Sử dụng các procs được lưu trữ (cách duy nhất được chấp nhận để chèn bất kỳ loại dữ liệu tài chính nào vì lý do kiểm soát nội bộ) để thực hiện tất cả các thao tác cơ sở dữ liệu không phải là ORM trong tâm trí của tôi. Tôi chưa bao giờ thấy bất kỳ giá trị nào đối với ORM đối với người thực sự biết rõ về SQL. Tôi cũng chưa từng làm việc trên một hệ thống (và tôi làm việc với các ứng dụng Enterprise rất phức tạp) phụ thuộc nhiều vào ORM, đơn giản là chúng không đủ tốt khi những gì bạn làm là phức tạp.
HLGEM

6
@HLGEM: Còn dữ liệu bạn lấy ra khỏi cơ sở dữ liệu thì sao? Khi bạn truy vấn cơ sở dữ liệu quan hệ, bạn không ánh xạ kết quả đến các đối tượng? Theo kinh nghiệm của tôi, có hai loại dự án sử dụng cơ sở dữ liệu quan hệ: những dự án sử dụng ORM của bên thứ ba và những dự án bao gồm các ORM được xây dựng kém của chính họ.
Carson63000

2
+1 Carson. Bạn sử dụng một số loại ORM bất kể là gì, trừ khi bạn chỉ cần trả lại DataSets thô và dán chúng vào mã của bạn (vi phạm nghiêm trọng nhất trong tất cả IMHO) vì bạn sẽ luôn phải ánh xạ kết quả của thủ tục được lưu trữ đó vào các lớp, đó chính xác là những gì ORM làm cho bạn.
Wayne Molina

4

ORM là một công cụ. Giống như tất cả các công cụ, khi được sử dụng phù hợp, chúng hoạt động khá tốt. Khi sử dụng không đúng cách, nó cần một cái búa lớn hơn và một số băng keo.

Trong trường hợp dự án hiện tại tôi đang thực hiện, nó sẽ được duy trì bởi những người không phải là nhà phát triển (chính xác là kỹ sư cơ khí) và vì vậy nó cần phải đơn giản và dễ dàng để tìm ra. Sẽ mất vài năm trước khi nhóm này có ngân sách để thuê các nhà phát triển (giả sử Tổng thống tiếp theo không bãi bỏ cơ quan liên quan), vì vậy khả năng bảo trì trong tương lai là một yếu tố chính trong những cân nhắc của chúng tôi.

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.