Có nên đưa logic kinh doanh vào Thủ tục lưu trữ hay không?


21

Luôn có một cuộc tranh luận về chủ đề này - "Có nên đưa logic kinh doanh vào Thủ tục lưu trữ hay không?". Nếu chúng tôi quyết định không sử dụng Công cụ ORM và không đưa Logic nghiệp vụ vào thủ tục lưu trữ thì chúng tôi sẽ đặt Logic nghiệp vụ ở đâu?

Trong các ứng dụng trước đây của tôi, tôi luôn ưu tiên chỉ đưa tất cả Logic nghiệp vụ vào các thủ tục được lưu trữ. Sau đó, từ mã .NET, tôi gọi các Quy trình được lưu trữ này bằng cách sử dụng Khối ứng dụng truy cập dữ liệu. SQLHelper, v.v. Nhưng đây không phải lúc nào cũng là kịch bản. Vì vậy, tôi đã làm một số googling nhưng cuối cùng trong bối rối .......

Có gợi ý nào không ...?


Tôi thiên vị -> Lưu trữ Procs luôn. Nhưng sau đó tôi thiên vị. Quên lập trình Agile, thực tế đáng buồn là trong thế giới kinh doanh, những thay đổi luôn xảy ra đột xuất và cần phải được thực hiện "ngay lập tức". Thủ tục lưu trữ cho phép điều đó. Đó là một cứu tinh. Cố gắng thực hiện những thay đổi như vậy thông qua cơ sở mã sẽ không khả thi.
Tối

4
@Darknight, Phụ thuộc nhiều vào nền tảng và kiến ​​trúc của bạn để đưa ra tuyên bố như vậy. Tôi không thấy lý do tại sao việc triển khai một thủ tục được lưu trữ vào cơ sở dữ liệu lại tốn ít thời gian hơn nhiều so với việc thực hiện một tập lệnh xây dựng và triển khai để xây dựng tệp WAR mới, triển khai nó và khởi động lại máy chủ ứng dụng.
maple_shaft

7
Thủ tục lưu trữ - bể tự hoại của khoa học máy tính.
Mongus Pong

1
Thủ tục lưu trữ - chỉ là một công cụ khác như bất kỳ công cụ khác.
sam yi

Câu trả lời:


15

Tôi sẽ áp dụng một cách tiếp cận thực tế - về mặt lịch sử, 'lợi ích' chính của việc giữ logic kinh doanh trong các procs được lưu trữ là vì lý do hiệu suất (kiến trúc 2,5 tầng), trong khi tách logic kinh doanh thành tầng BLL (tầng 3 / N) thường sạch hơn với quan điểm bảo trì và dễ kiểm tra hơn (Mock / Stub out truy cập dữ liệu).

Tuy nhiên, do các ORMS .NET hỗ trợ LINQ như LINQ2Query, EF và NHibernate hiện tạo các truy vấn SQL được tham số hóa, trong đó các kế hoạch truy vấn có thể được lưu trong bộ nhớ cache, được thoát cho SQL Injection, v.v., tôi đoán rằng việc chuyển sang kiến ​​trúc tầng 3 / N là hấp dẫn hơn bao giờ hết và hầu hết các XUÂN (đặc biệt là các trung tâm truy vấn) có thể tránh được hoàn toàn. Các mẫu kho lưu trữ trong .NET thường hiển thị các tham số cây Biểu thức IQueryable / accept, cho phép truy cập an toàn nhưng linh hoạt vào các bảng của bạn. (Cá nhân trong các kiến ​​trúc kiểu SOA, tôi sẽ không đưa ra IQueryable ngoài BLL, tức là các tầng Dịch vụ và Trình bày của bạn nên hoạt động với một bộ phương thức được xác định rõ. Lý do là nếu không bạn không thể kiểm tra đầy đủ hệ thống của mình và bạn đã thắng '

Tuy nhiên, trong một hệ thống có kích thước khá, sẽ luôn có một vài trường hợp ngoại lệ, trong đó một đoạn mã thực sự dữ liệu có thể vẫn cần phải được viết dưới dạng Proc được lưu trữ vì lý do hiệu năng. Trong các trường hợp này, tôi sẽ giữ XUÂN và hiển thị XUÂN thông qua ORM, nhưng vẫn hiển thị chức năng như một phương thức chuyển qua trên BLL của bạn.


1
+1 để dễ dàng viết các bài kiểm tra đơn vị ở tầng ứng dụng, tuy nhiên các khung kiểm tra đơn vị DB tự động đã đi một chặng đường dài.
maple_shaft

14

Trở thành một nhà phát triển java, sở thích của tôi là đưa logic kinh doanh vào BLL (kiểm soát nguồn dễ dàng và dễ dàng, quen thuộc, v.v.).

Tuy nhiên, sau khi làm việc cho một doanh nghiệp lớn có nhiều ứng dụng phân tán sử dụng các công nghệ khác nhau (C #, Java, Pick (không hỏi)), một lợi ích đáng kể của việc sử dụng các thủ tục được lưu trữ đã trở nên rõ ràng:

Thủ tục lưu trữ có thể được chia sẻ trên các ứng dụng khác nhau .


Điểm rất tốt
NoChance

1
Điều này rất đúng, và chúng tôi sử dụng nó để ảnh hưởng tốt trong môi trường của chúng tôi. Tuy nhiên, việc chia sẻ mã bằng cách sử dụng lớp dữ liệu luôn có vẻ hơi nguy hiểm đối với tôi. Nếu bạn có nhiều người tiêu dùng của một đoạn logic / dữ liệu nhất định thì tôi muốn đặt một dịch vụ trước nó hơn là có nhiều người tiêu dùng của cùng một cơ sở dữ liệu.
RationalGeek

2
Nếu bạn tách quản lý dữ liệu của mình thành các thư viện, các thư viện đó cũng có thể được chia sẻ trên các ứng dụng khác nhau về mặt lý thuyết ...
glenatron

2
Tôi đồng ý một phần. Tất cả các công nghệ này đang truy cập cơ sở dữ liệu trực tiếp; vì vậy bạn đang sử dụng các thủ tục được lưu trữ để chia sẻ mã chung giữa chúng. Bạn cũng có thể giải quyết vấn đề tương tự bằng cách có một tầng trung lưu và có các giải pháp không đồng nhất truy cập vào tầng giữa của bạn thay vì cơ sở dữ liệu của bạn và tầng trung gian đó chia sẻ mã như vậy.
Ekevoo

1
fyi câu trả lời này là baloney, 6yrs sau - chỉ có dữ liệu trong cơ sở dữ liệu. Bạn đặt logic trong đó bạn có rất nhiều rắc rối xuống dòng. Chỉ cần xây dựng microservice bằng ngôn ngữ bạn chọn truy cập db.
NimChimpsky

6

Nhóm của chúng tôi có một quy tắc mềm ở đây. Đôi khi, tốt hơn là giải quyết Logic nghiệp vụ trong T-SQL, đôi khi làm điều đó dễ dàng hơn trong c # (Lớp nghiệp vụ).

Vì vậy, chúng tôi có một giải pháp thực tế: Đặt nơi phù hợp hơn. Tôi biết lý thuyết đôi khi rất nghiêm ngặt về nó ... nhưng đó là lý thuyết :-)


2
Chắc chắn đây là giải pháp tồi tệ nhất? Làm thế nào để một nhà phát triển bảo trì biết nơi logic được lưu trữ? Tôi sẽ tưởng tượng rằng đôi khi nó cũng chui vào lớp ứng dụng, hoặc thậm chí tệ hơn, UI?
Paul T Davies

2
Không. Nó luôn ở trong Lớp nghiệp vụ hoặc T-SQL. Tìm ra nơi logic được lưu trữ có lẽ là vấn đề nhỏ nhất khi bảo trì.
gsharp

Điều gì xảy ra khi ai đó tham gia nhóm và bạn nói với họ quy tắc này? Làm thế nào để họ biết nơi nào đó "phù hợp hơn"? Điều này gần như là một quy tắc đối với tôi. Rất chủ quan dựa trên cá nhân.
RationalGeek

3
Nào các bạn, nghiêm túc chứ? Chúng tôi sử dụng những người có bộ não để suy nghĩ và có một số kinh nghiệm trên tàu. Sau đó .. oh vâng, họ có một miệng để hỏi và làm cuộc trò chuyện. Tôi có thể nói rằng phần mềm của chúng tôi cần bảo trì rất thấp và các tính năng mới có thể được triển khai tốt bởi hầu hết mọi người trong nhóm của chúng tôi. chúng ta không thể làm sai điều đó
gsharp

4
Tôi thực sự không thấy có ý nghĩa gì khi lạm dụng c # cho những thứ mà SQLServer có thể làm tốt hơn nhiều và ngược lại.
gsharp

3

Có những lợi thế và bất lợi cho cả hai (theo ý kiến ​​của tôi):

Các thủ tục được lưu trữ có thể trở thành một cơn ác mộng nếu bạn không sử dụng một số loại kiểm soát nguồn SQL (mà rất nhiều nơi không có) và bạn có nhiều nhà phát triển làm việc trên chúng. Ai đó có thể thay đổi một thủ tục được lưu trữ và quên cập nhật mã gọi thủ tục đó và trước khi bạn biết nó vừa xây dựng và triển khai một trang web sẽ đưa ra các ngoại lệ chưa được xử lý (tham số đếm không khớp, v.v.).

Mặt khác, các quy trình được lưu trữ cho phép sửa lỗi nhanh hơn trong các tình huống nhất định. Nếu có một lỗi với một thủ tục được lưu trữ, bạn chỉ cần sửa nó và bạn đã hoàn tất. Một sửa lỗi trong ORM yêu cầu xây dựng lại. Tùy thuộc vào quá trình xây dựng của bạn, điều này có thể kéo dài / gây phiền nhiễu.


+1 cho nhu cầu kiểm soát nguồn với các procs được lưu trữ nếu bạn sẽ sử dụng chúng nhiều. Nhiều DBA mà tôi đã làm việc cùng rất chống lại ý tưởng này.
RationalGeek

2

Chúng tôi luôn đặt Logic nghiệp vụ của mình trong Lớp logic nghiệp vụ. Nếu bạn đặt nó trong Thủ tục lưu trữ, nó sẽ bị mất khi bạn thay đổi RDBMS.


16
Điều cuối cùng thay đổi là RDBMS ;-)
gsharp

Vậy có nghĩa là, bạn giới hạn Quy trình được lưu trữ để tìm nạp, Cập nhật và Chèn dữ liệu ....?
Pravin Patil

1
Mọi hệ thống lớn tôi từng thấy, thực tế là cơ sở dữ liệu là hệ thống. Các ngôn ngữ lập trình gần như trở nên không liên quan tại thời điểm này chỉ là "mặt trước" ..
Darknight

2
@gsharp, điều đó không phải lúc nào cũng đúng. Bạn có thể muốn thêm một RDBMS khác như Oracle hoặc để thay thế hoàn toàn cái RDBMS hiện có. Hoặc, trong một số trường hợp, bạn muốn thay thế dữ liệu thực bằng dữ liệu giả.
šljaker

2
@ šljaker tất nhiên không phải lúc nào cũng đúng. Nhưng nhiều khả năng chương trình thay đổi (thiết kế lại phần mềm, ngôn ngữ lập trình mới, v.v.) chứ không phải DB.
gsharp

2

"Logic kinh doanh" là một thuật ngữ mơ hồ. Tôi có nghĩa là nó không có một định nghĩa duy nhất. Một nguyên tắc nhỏ là giảm thiểu giao tiếp giữa các tầng khi bạn có thể. Vì vậy, bạn không cần phải gửi tên khách hàng trống đến máy chủ để kiểm tra trước khi chèn một hàng.

Có những trường hợp, khi một quy tắc dựa trên cơ sở dữ liệu đọc. Giả sử bạn muốn chuyển tiền từ Tài khoản 1 sang Tài khoản 2. Bạn cần đọc cả hai tài khoản, đảm bảo rằng chúng ở trạng thái tốt và số tiền trong Tài khoản 1 là đủ. Trong trường hợp này, máy chủ là ứng cử viên tốt hơn cho quy tắc này vì máy khách (là BL ở đây) không cần phải thực hiện 3 cuộc gọi đến tầng cơ sở dữ liệu cho quy trình này.

Tất nhiên, nếu bạn cần giải pháp của mình độc lập với cơ sở dữ liệu, hãy tạo các procs được lưu trữ chỉ cho CRUD (nếu được sử dụng).


1

Logic nên có trong BLL luôn vì:

  • Nó có thể được kiểm tra đúng
  • Khi SQL 20XX trở nên lỗi thời và bạn cần thay đổi sang phiên bản mới nhất, bạn không phải viết lại mã của mình.
  • Mọi người không muốn thực hiện các thay đổi nhanh chóng (dường như được đưa ra như một cuộc tranh luận CHO SP)
  • SP, theo kinh nghiệm của tôi, là điểm lớn nhất của lỗi nhà phát triển, đặc biệt là sau một vài thế hệ bảo trì / thay đổi.

Tôi tin rằng nên có luật quy định rằng sau khi SP dài hơn X dòng, nó không hoạt động như dự định.


Điều gì là sai với những thay đổi trên bay? Nếu có một lỗi trong một thủ tục được lưu trữ và nó có thể dễ dàng sửa chữa, sau đó sửa nó. Đó là một điều tích cực bởi vì điều đó có nghĩa là bạn không phải phát hành lại cho một cái gì đó tầm thường. Chừng nào mọi người không bắt đầu che giấu các lỗi trong mã bằng cách thay đổi các thủ tục được lưu trữ thì tôi thấy không có vấn đề gì.
AndrewC

Bằng cách thay đổi nhanh chóng, tôi có nghĩa là những thứ không được thử nghiệm và không tuân theo quy trình phát hành chính thức. Và vâng, sp thay đổi đối với các lỗi mã mặt nạ là điều mà tôi đã thấy một chút công bằng.
Paul T Davies

0

Chúng tôi tạo một lớp dịch vụ chứa tất cả logic nghiệp vụ của chúng tôi được triển khai bằng ngôn ngữ đã chọn và chỉ sử dụng cơ sở dữ liệu cho các truy vấn. Cách tiếp cận này được chúng tôi ủy quyền vì mục tiêu của chúng tôi là tạo ra các giải pháp COTS để cung cấp các ứng dụng với các triển khai cơ sở dữ liệu khác nhau. Hibernate đã được chứng minh là cứu cánh cho chúng ta trong những trường hợp này.

Tôi nghĩ rằng ưu điểm lớn nhất của phương pháp này, ngoài tính di động của cơ sở dữ liệu, là bạn có thể tìm thấy tất cả các câu trả lời của mình trong một tìm kiếm.

Ngoài ra, mặc dù có một số câu trả lời cho một diễn đàn, tôi có một người bạn làm việc cho một công ty bảo hiểm may mắn 100 người đã thực hiện 2 chuyển đổi cơ sở dữ liệu trong ba năm vì cơ sở dữ liệu lựa chọn cho công ty đã thay đổi.


0

Theo kinh nghiệm hạn chế của tôi, tôi thích duy trì tính toàn vẹn dữ liệu với các thủ tục được lưu trữ và các tính năng cơ sở dữ liệu khác. Ví dụ: nếu tôi đang thực hiện chuyển tiền giữa hai tài khoản, tôi sẽ viết một thủ tục được lưu trữ. Tôi thấy nó có giá trị để có thể sử dụng nhiều ngôn ngữ ứng dụng.

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.