ฉันเป็นผู้เชื่อที่แข็งแกร่งในการป้องกันไม่ให้ตรรกะทางธุรกิจออกจากฐานข้อมูลให้มากที่สุด อย่างไรก็ตามในฐานะนักพัฒนาประสิทธิภาพของ บริษัท ของฉันฉันขอขอบคุณที่บางครั้งก็จำเป็นเพื่อให้ได้ประสิทธิภาพที่ดี แต่ฉันคิดว่ามันจำเป็นน้อยกว่าที่ผู้คนเรียกร้อง
ฉันโต้แย้งข้อดีข้อเสียของคุณ
คุณอ้างว่ามันรวมศูนย์ตรรกะทางธุรกิจของคุณ ในทางตรงกันข้ามฉันคิดว่ามันเป็นการกระจายอำนาจ ในผลิตภัณฑ์ที่ฉันใช้งานในปัจจุบันเราใช้กระบวนงานที่เก็บไว้สำหรับตรรกะทางธุรกิจจำนวนมากของเรา ปัญหาด้านประสิทธิภาพหลายอย่างของเรามาจากฟังก์ชั่นการโทรซ้ำ ๆ ตัวอย่างเช่น
select <whatever>
from group g
where fn_invoker_has_access_to_group(g.group_id)
ปัญหาเกี่ยวกับวิธีการนี้คือโดยทั่วไป (อาจมีบางกรณีที่สิ่งนี้เป็นเท็จ) บังคับให้ฐานข้อมูลรันฟังก์ชัน N ของคุณครั้งละหนึ่งแถว บางครั้งฟังก์ชั่นนั้นมีราคาแพง ฐานข้อมูลบางตัวรองรับดัชนีฟังก์ชัน แต่คุณไม่สามารถจัดทำดัชนีฟังก์ชันที่เป็นไปได้ทั้งหมดกับอินพุตที่เป็นไปได้ทั้งหมด หรือคุณสามารถ
วิธีแก้ปัญหาทั่วไปสำหรับปัญหาข้างต้นคือการแยกลอจิกจากฟังก์ชั่นและผสานเข้ากับแบบสอบถาม ตอนนี้คุณมี encapsulation และตรรกะที่ซ้ำซ้อน
ปัญหาอื่นที่ฉันเห็นคือการเรียกกระบวนงานที่เก็บไว้ในการวนซ้ำเนื่องจากไม่มีวิธีเข้าร่วมหรือตัดชุดผลลัพธ์ proc ที่จัดเก็บไว้
declare some_cursor
while some_cursor has rows
exec some_other_proc
end
ถ้าคุณดึงโค้ดจาก proc ที่ซ้อนกันคุณก็จะทำการกระจายอำนาจอีกครั้ง ดังนั้นคุณถูกบังคับให้เลือกระหว่างการห่อหุ้มและประสิทธิภาพ
โดยทั่วไปแล้วฉันพบว่าฐานข้อมูลไม่ดีที่:
- การคำนวณ
- การวนซ้ำ (เหมาะสำหรับการตั้งค่า)
- โหลดบาลานซ์
- วจีวิภาค
ฐานข้อมูลดีที่:
- การล็อคและปลดล็อค
- รักษาข้อมูลและความสัมพันธ์ของพวกเขา
- สร้างความมั่นใจในความซื่อสัตย์
ด้วยการดำเนินการที่มีราคาแพงเช่นลูปและการแยกสตริงและเก็บไว้ในระดับแอปของคุณคุณสามารถปรับขนาดแอปพลิเคชันในแนวนอนเพื่อประสิทธิภาพที่ดีขึ้น การเพิ่มเซิร์ฟเวอร์แอปหลายตัวที่อยู่เบื้องหลังตัวโหลดบาลานซ์มักจะถูกกว่าการตั้งค่าการจำลองแบบฐานข้อมูล
อย่างไรก็ตามคุณถูกต้องแล้วมันจะทำการแยกตรรกะทางธุรกิจของคุณออกจากภาษาการเขียนโปรแกรมของแอปพลิเคชันของคุณ แต่ฉันไม่เห็นว่าทำไมจึงเป็นข้อได้เปรียบ หากคุณมีแอพ Java แสดงว่าคุณมีแอพ Java การแปลงรหัส Java มัดเป็นกระบวนการที่เก็บไว้ไม่ได้เปลี่ยนความจริงที่ว่าคุณมีแอป Java
การตั้งค่าของฉันคือการเก็บรหัสฐานข้อมูลที่เน้นการติดตา คุณจะสร้างวิดเจ็ตใหม่ได้อย่างไร? คุณต้องแทรกลงใน 3 ตารางและพวกเขาจะต้องอยู่ในการทำธุรกรรม ที่อยู่ในขั้นตอนการจัดเก็บ
การกำหนดสิ่งที่สามารถทำได้กับวิดเจ็ตและกฎทางธุรกิจสำหรับการค้นหาวิดเจ็ตเป็นของแอปพลิเคชันของคุณ