จะวางตรรกะทางธุรกิจไว้ใน Stored Procedure หรือไม่


21

มีการถกเถียงกันในหัวข้อนี้เสมอ - "ไม่ว่าจะวางตรรกะทางธุรกิจในกระบวนงานที่เก็บไว้หรือไม่ หากเราตัดสินใจที่จะไม่ใช้เครื่องมือ ORM และไม่ใส่ Business Logic ใน Stored Procedure เราจะวาง Business Logic ไว้ที่ไหน?

ในแอปพลิเคชันก่อนหน้าของฉันฉันมักจะต้องการวาง Business Logic ทั้งหมดในขั้นตอนการจัดเก็บเท่านั้น จากนั้นในรหัส. NET ฉันเรียกขั้นตอนการจัดเก็บเหล่านี้โดยใช้ Data Application Application Blocks SQLHelper เป็นต้น แต่นี่ไม่สามารถเป็นสถานการณ์ได้ตลอดเวลา ดังนั้นฉันจึงทำ googling แต่ก็สับสนในที่สุด .......

ข้อเสนอแนะใด ๆ ... ?


ฉันลำเอียง -> Procs ที่เก็บไว้เสมอ แต่ฉันก็มีอคติ ลืมการเขียนโปรแกรมเปรียวความจริงที่น่าเศร้าก็คือในโลกธุรกิจที่เปลี่ยนแปลงจะเกิดขึ้นตามปกติและต้องทำ "ทันที" ขั้นตอนการจัดเก็บอนุญาตให้ มันช่วยชีวิต การพยายามทำการเปลี่ยนแปลงดังกล่าวผ่าน codebase นั้นจะไม่สามารถทำได้
Darknight

4
@Darknight ขึ้นอยู่กับแพลตฟอร์มและสถาปัตยกรรมของคุณเป็นอย่างมาก ฉันไม่เห็นสาเหตุที่การปรับใช้โพรซีเดอร์ที่เก็บไว้ในฐานข้อมูลนั้นใช้เวลาน้อยกว่าการรันสคริปต์ในการสร้างและปรับใช้เพื่อสร้างไฟล์ WAR ใหม่ปรับใช้และรีสตาร์ทเซิร์ฟเวอร์แอป
maple_shaft

7
ขั้นตอนการเก็บ - ถังบำบัดน้ำเสียของวิทยาศาสตร์คอมพิวเตอร์
Mongus Pong

1
ขั้นตอนการจัดเก็บ - เป็นอีกเครื่องมือหนึ่งที่เหมือนกัน
sam yi

คำตอบ:


15

ฉันจะนำวิธีการปฏิบัติ - ประวัติศาสตร์ 'ประโยชน์' หลักของการรักษาตรรกะทางธุรกิจใน procs ที่เก็บไว้สำหรับเหตุผลด้านประสิทธิภาพ (สถาปัตยกรรมชั้น 2.5) ในขณะที่การแยกตรรกะทางธุรกิจเป็นชั้น BLL (3 / N ชั้น) โดยทั่วไปจะสะอาดจาก มุมมองการบำรุงรักษาและง่ายต่อการทดสอบ (จำลอง / ตัดการเข้าถึงข้อมูล)

อย่างไรก็ตามจากที่เปิดใช้งาน. NET ORMS ที่เปิดใช้งาน LINQ เช่น LINQ2SQL, EF และ NHibernate ในขณะนี้จะสร้างการสืบค้น SQL ที่กำหนดพารามิเตอร์ซึ่งแผนการเคียวรีสามารถแคชไว้ได้จะถูกหลบหนีสำหรับ SQL Injection เป็นต้นฉันเดาว่าการย้ายไปสู่สถาปัตยกรรมชั้น 3 / N น่าดึงดูดยิ่งกว่าที่เคยและ SPROC ส่วนใหญ่ (โดยเฉพาะข้อความค้นหาเป็นศูนย์กลาง) สามารถหลีกเลี่ยงได้ทั้งหมด รูปแบบพื้นที่เก็บข้อมูลใน. NET มักจะเปิดเผยพารามิเตอร์ IQueryable / ยอมรับ Expression tree ช่วยให้สามารถเข้าถึงตารางของคุณได้อย่างปลอดภัย แต่มีความยืดหยุ่น (โดยส่วนตัวในสถาปัตยกรรมประเภท SOA ฉันจะไม่เปิดเผย IQueryable เกิน BLL นั่นคือระดับการบริการและการนำเสนอของคุณควรทำงานกับชุดของวิธีการที่กำหนดไว้อย่างดีเหตุผลคือมิฉะนั้นคุณจะไม่สามารถทดสอบระบบของคุณได้อย่างสมบูรณ์

อย่างไรก็ตามในระบบที่มีขนาดพอเหมาะจะมีข้อยกเว้นเล็กน้อยอยู่เสมอซึ่งชิ้นส่วนที่มีความเข้มข้นของข้อมูลจริงๆอาจยังต้องถูกเขียนเป็น Stored Proc ด้วยเหตุผลด้านประสิทธิภาพ ในกรณีเหล่านี้ฉันจะเก็บ SPROC และเปิดเผย SPROC ผ่าน ORM แต่ยังคงแสดงฟังก์ชันเป็นวิธีการส่งผ่านบน BLL ของคุณ


1
+1 เพื่อง่ายต่อการเขียนการทดสอบหน่วยที่ระดับแอ็พพลิเคชันอย่างไรก็ตามกรอบการทดสอบหน่วย DB อัตโนมัติมาไกลแล้ว
maple_shaft

14

การเป็นนักพัฒนาจาวาการตั้งค่าของฉันคือการวางตรรกะทางธุรกิจใน BLL (การควบคุมแหล่งที่ดีและง่ายความคุ้นเคย ฯลฯ ฯลฯ )

อย่างไรก็ตามหลังจากทำงานให้กับองค์กรขนาดใหญ่ที่มีแอพพลิเคชั่นแบบกระจายจำนวนมากที่ใช้เทคโนโลยีที่แตกต่างกัน (C #, Java, Pick (ไม่ต้องถาม)) ประโยชน์ที่สำคัญอย่างหนึ่งของการใช้โพรซีเดอร์ที่เก็บไว้

วิธีการจัดเก็บสามารถใช้ร่วมกันในการใช้งานที่แตกต่างกัน


จุดดีมาก
NoChance

1
นี่เป็นเรื่องจริงมากและเราใช้เพื่อผลกระทบที่ดีในสภาพแวดล้อมของเรา อย่างไรก็ตามการแชร์รหัสโดยใช้ชั้นข้อมูลนั้นค่อนข้างอันตรายสำหรับฉันเสมอ หากคุณมีผู้บริโภคหลายคนของชิ้นส่วนของตรรกะ / ข้อมูลที่กำหนดแล้วฉันควรจะให้บริการต่อหน้ามันแทนที่จะมีผู้บริโภคหลายรายของฐานข้อมูลเดียวกัน
RationalGeek

2
หากคุณแบ่งการจัดการข้อมูลของคุณออกเป็นห้องสมุดห้องสมุดเหล่านั้นสามารถแชร์ผ่านแอปพลิเคชันที่แตกต่างกันในทางทฤษฎี ...
Glenatron

2
ฉันเห็นด้วยบางส่วน เทคโนโลยีทั้งหมดนี้กำลังเข้าถึงฐานข้อมูลโดยตรง ดังนั้นคุณจึงใช้วิธีการที่เก็บไว้เพื่อแบ่งปันรหัสทั่วไปในหมู่พวกเขา คุณสามารถแก้ไขปัญหาเดียวกันได้ด้วยการมีเทียร์ระดับกลางและมีวิธีแก้ปัญหาที่แตกต่างกันในการเข้าถึงเทียร์กลางของคุณแทนฐานข้อมูลของคุณและเทียร์กลางนั้นแชร์รหัสดังกล่าว
Ekevoo

1
fyi คำตอบนี้คือ baloney, 6 ปีต่อมา - มีเพียงข้อมูลในฐานข้อมูลเท่านั้น คุณใส่ตรรกะลงไปในนั้นคุณมีปัญหามากมายในบรรทัด เพียงแค่สร้าง microservice ในภาษาที่คุณเลือกซึ่งเข้าถึง db
NimChimpsky

6

ทีมของเรามีกฎนุ่มนวลที่นี่ บางครั้งการแก้ไข Business Logic ใน T-SQL จะดีกว่าในบางครั้งมันจะง่ายกว่าใน c # (ชั้นธุรกิจ)

ดังนั้นเราจึงมีวิธีแก้ปัญหาในทางปฏิบัติ: วางในที่ที่มันเหมาะกว่า ฉันรู้ว่าบางครั้งทฤษฎีก็เข้มงวดมากเกี่ยวกับเรื่องนี้ แต่นั่นคือทฤษฎี :-)


2
แน่นอนนี่เป็นทางออกที่เลวร้ายที่สุดของทั้งหมดหรือไม่ นักพัฒนาซอฟต์แวร์จะทราบได้อย่างไรว่าเก็บตรรกะไว้ที่ใด ฉันคิดว่าบางครั้งมันก็เล็ดลอดออกมาในเลเยอร์แอปพลิเคชันหรือแย่กว่านั้นคือ UI?
Paul T Davies

2
Nope มันมักจะเป็น Business Layer หรือ T-SQL การหาที่เก็บตรรกะควรเป็นปัญหาที่เล็กที่สุดเมื่อพูดถึงการบำรุงรักษา
gsharp

จะเกิดอะไรขึ้นเมื่อมีคนเข้าร่วมทีมและคุณบอกกฎนี้กับพวกเขา พวกเขาควรจะรู้ได้อย่างไรว่าบางสิ่งบางอย่าง "พอดีดีกว่า"? ดูเหมือนว่านี่จะไม่ใช่กฎสำหรับฉัน อัตนัยมากขึ้นอยู่กับแต่ละบุคคล
RationalGeek

3
เอาจริง ๆ เหรอ เราจ้างคนที่มีสมองในการคิดและมีประสบการณ์มาบนเรือ ถ้าอย่างนั้น .. ใช่แล้วพวกเขามีปากถามและคุยกัน ฉันสามารถพูดได้ว่าซอฟต์แวร์ของเราต้องการการบำรุงรักษาที่ต่ำมากและคุณสมบัติใหม่ ๆ สามารถนำไปใช้ได้ดีโดยเกือบทุกคนในทีมของเรา ไม่สามารถผิดที่สิ่งที่เราทำ
gsharp

4
ฉันไม่รู้สึกถึงการใช้ผิดวิธี c # ในสิ่งที่ SQLServer สามารถทำได้ดีกว่ามากและในทางกลับกัน
gsharp

3

มีข้อดีและข้อเสียทั้ง (ในความคิดของฉัน):

กระบวนงานที่เก็บไว้อาจกลายเป็นฝันร้ายหากคุณไม่ได้ใช้ตัวควบคุมแหล่งข้อมูล SQL บางประเภท (ซึ่งหลายแห่งไม่ได้อยู่) และคุณมีนักพัฒนาหลายคนทำงานอยู่ บางคนสามารถเปลี่ยนกระบวนงานที่เก็บไว้และลืมอัปเดตรหัสที่เรียกขั้นตอนนั้นและก่อนที่คุณจะรู้ว่าคุณเพิ่งสร้างและปรับใช้ไซต์ที่จะส่งข้อยกเว้นที่ไม่สามารถจัดการได้ (พารามิเตอร์จำนวนไม่ตรงกัน ฯลฯ )

ในทางกลับกันขั้นตอนการจัดเก็บอนุญาตให้แก้ไขข้อผิดพลาดได้เร็วขึ้นในบางสถานการณ์ หากมีข้อผิดพลาดกับขั้นตอนการจัดเก็บคุณเพียงแค่แก้ไขมันและคุณทำเสร็จแล้ว การแก้ไขข้อบกพร่องใน ORM ต้องมีการสร้างใหม่ ขึ้นอยู่กับกระบวนการสร้างของคุณซึ่งอาจยาว / น่ารำคาญ


+1 สำหรับความต้องการการควบคุมแหล่งที่มาพร้อมกับ procs ที่เก็บไว้ถ้าคุณจะใช้มันอย่างหนัก DBA จำนวนมากที่ฉันได้ทำงานด้วยมีความต้านทานต่อความคิดนี้มาก
RationalGeek

2

เราใส่ตรรกะทางธุรกิจของเราไว้ในชั้นตรรกะทางธุรกิจเสมอ หากคุณวางไว้ใน Stored Procedure มันจะหายไปเมื่อคุณเปลี่ยน RDBMS ของคุณ


16
สิ่งสุดท้ายที่เปลี่ยนแปลงคือ RDBMS ;-)
gsharp

หมายความว่าคุณ จำกัด ขั้นตอนการจัดเก็บไว้เพื่อดึงข้อมูลอัปเดตและแทรกข้อมูล .... หรือไม่
Pravin Patil

1
ทุกระบบที่มีขนาดใหญ่ที่ฉันเห็นความจริงก็คือฐานข้อมูลเป็นระบบ ภาษาการเขียนโปรแกรมเกือบจะไม่เกี่ยวข้องในจุดนี้เช่นเดียวกับ "front end" ..
Darknight

2
@ gsharp นั่นไม่จริงเสมอไป คุณอาจต้องการเพิ่ม RDBMS อื่นเช่น Oracle หรือแทนที่ที่มีอยู่ทั้งหมด หรือในบางกรณีคุณต้องการแทนที่ข้อมูลจริงด้วยข้อมูลจำลอง
šljaker

2
@ แน่นอนว่ามันไม่จริงเสมอไป แต่มีโอกาสมากขึ้นที่โปรแกรมจะเปลี่ยนแปลง (ออกแบบซอฟต์แวร์ภาษาโปรแกรมใหม่ ฯลฯ ) แทนที่จะเป็น DB
gsharp

2

"ตรรกะทางธุรกิจ" เป็นคำที่คลุมเครือ ฉันหมายความว่ามันไม่มีคำจำกัดความเดียว กฎง่ายๆคือการลดการสื่อสารระหว่างชั้นเมื่อคุณสามารถ ดังนั้นคุณไม่จำเป็นต้องส่งชื่อลูกค้าเปล่าไปยังเซิร์ฟเวอร์เพื่อตรวจสอบก่อนที่จะแทรกแถว

มีหลายกรณีเมื่อกฎอ้างอิงตามการอ่านฐานข้อมูล สมมติว่าคุณต้องการโอนเงินจากบัญชี 1 ไปยังบัญชี 2 คุณต้องอ่านทั้งสองบัญชีตรวจสอบให้แน่ใจว่าพวกเขาอยู่ในสถานะที่ดีและจำนวนเงินในบัญชี 1 เพียงพอแล้ว ในกรณีนี้เซิร์ฟเวอร์เป็นตัวเลือกที่ดีกว่าสำหรับกฎนี้เนื่องจากไคลเอนต์ (เป็น BL ที่นี่) ไม่จำเป็นต้องออกการเรียก 3 ไปยังระดับฐานข้อมูลสำหรับกระบวนการนี้

แน่นอนถ้าคุณต้องการโซลูชันของคุณที่จะเป็นฐานข้อมูลให้ procs ที่เก็บไว้สำหรับ CRUD เท่านั้น (ถ้าใช้ทั้งหมด)


1

ตรรกะควรอยู่ใน BLL เสมอเพราะ:

  • มันสามารถทดสอบได้อย่างถูกต้อง
  • เมื่อ SQL 20XX ล้าสมัยและคุณต้องเปลี่ยนเป็นเวอร์ชั่นล่าสุดคุณไม่จำเป็นต้องเขียนรหัสใหม่
  • ผู้คนไม่ถูกล่อลวงให้ทำการเปลี่ยนแปลงในทันที (ซึ่งดูเหมือนว่าจะถูกหยิบยกเป็นอาร์กิวเมนต์สำหรับ SP)
  • SP ในประสบการณ์ของฉันเป็นจุดที่ใหญ่ที่สุดของข้อผิดพลาดของนักพัฒนาโดยเฉพาะอย่างยิ่งหลังจากการบำรุงรักษา / การเปลี่ยนแปลงรุ่นไม่กี่

ฉันเชื่อว่าควรมีกฎหมายที่ระบุว่าหลังจาก SP มีความยาวมากกว่า X เส้นมันไม่ทำงานตามที่ตั้งใจ


เกิดอะไรขึ้นกับการเปลี่ยนแปลงในทันที? หากมีข้อผิดพลาดในขั้นตอนการจัดเก็บและแก้ไขได้ง่ายให้แก้ไข มันเป็นเรื่องที่ดีเพราะมันหมายความว่าคุณไม่ต้องทำรีลีสใหม่สำหรับบางสิ่งที่ไม่สำคัญ ตราบใดที่ผู้คนไม่เริ่มปกปิดข้อผิดพลาดในรหัสด้วยการเปลี่ยนขั้นตอนการจัดเก็บฉันก็จะเห็นว่าไม่มีปัญหา
AndrewC

จากการเปลี่ยนแปลงในทันทีฉันหมายถึงสิ่งที่ไม่ได้ทดสอบและไม่ทำตามขั้นตอนการปล่อยอย่างเป็นทางการ และใช่การเปลี่ยนแปลง sp ในการปกปิดรหัสข้อผิดพลาดเป็นสิ่งที่ฉันได้เห็นบ้าง
Paul T Davies

0

เราสร้างชั้นบริการที่มีตรรกะทางธุรกิจทั้งหมดของเราถูกนำไปใช้ในภาษาที่เลือกและใช้ฐานข้อมูลสำหรับการสืบค้นเท่านั้น แนวทางนี้จัดทำขึ้นโดยเราเนื่องจากเป้าหมายของเราคือการสร้างโซลูชัน COTS เพื่อส่งมอบแอปพลิเคชันด้วยการใช้ฐานข้อมูลที่หลากหลาย ไฮเบอร์เนตได้พิสูจน์แล้วว่าเป็นผู้ช่วยชีวิตสำหรับเราในสถานการณ์เหล่านี้

ฉันคิดว่าข้อได้เปรียบที่ยิ่งใหญ่ที่สุดของวิธีการนี้นอกเหนือจากความสามารถในการพกพาฐานข้อมูลคือคุณสามารถค้นหาคำตอบทั้งหมดได้ในการค้นหาเพียงครั้งเดียว

นอกจากนี้แม้จะมีคำตอบบางส่วนในฟอรัม แต่ฉันมีเพื่อนที่ทำงานให้ บริษัท ประกันภัยที่มีโชคลาภ 100 คนที่ได้ทำการแปลงฐานข้อมูล 2 ครั้งในเวลาสามปีเพราะฐานข้อมูลที่เลือกสำหรับ บริษัท เปลี่ยนไป


0

จากประสบการณ์ที่ จำกัด ของฉันฉันต้องการรักษาความถูกต้องของข้อมูลด้วยขั้นตอนการจัดเก็บและคุณสมบัติฐานข้อมูลอื่น ๆ ตัวอย่างเช่นหากฉันใช้การโอนเงินระหว่างสองบัญชีฉันจะเขียนขั้นตอนการจัดเก็บ ฉันคิดว่ามันมีค่าที่จะสามารถใช้หลายภาษาของแอปพลิเคชัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.