ที่เก็บควรทำอะไรจริงๆ


15

ฉันได้ยินรูปแบบที่เก็บจำนวนมาก แต่ฉันไม่เข้าใจว่าที่เก็บควรทำอะไร เมื่อฉันพูดว่า "พื้นที่เก็บข้อมูลควรทำอะไรจริงๆ" ฉันกังวลเกี่ยวกับวิธีการที่ควรใช้เป็นหลัก ตัวอย่างเช่นที่เก็บควรให้วิธีการ CRUD หรือควรให้วิธีการที่แตกต่างกัน?

ฉันหมายถึงที่เก็บควรมีตรรกะทางธุรกิจหรือควรประกอบด้วยตรรกะในการสื่อสารกับแหล่งข้อมูลและจัดการเอนทิตีที่จะบันทึกหรือโหลด?

นอกจากนี้ฉันเคยได้ยินว่าที่เก็บเป็นหน่วยของการคงอยู่ของมวลรวม แต่นั่นเป็นอย่างไร ฉันล้มเหลวที่จะเข้าใจวิธีการทำงานในทางปฏิบัติ ฉันคิดว่าเราควรมีเพียงหนึ่งอินเตอร์เฟสIRepositoryที่มีเมธอด CRUD และสำหรับเอนทิตีใด ๆ การใช้งานจะมีตรรกะในการบันทึกและดึงข้อมูลประเภทนั้นจากแหล่งข้อมูล


4
"ที่เก็บควรมีตรรกะทางธุรกิจ" - ไม่
ozz

1
นี่คือคำตอบของฉันสำหรับคำถามที่เกี่ยวข้องใน SO
Eric King

2
ฉันคิดว่าคุณกำลังติดอยู่กับคำว่า "ควร" - พื้นที่เก็บข้อมูลเป็นรูปแบบเฉพาะคุณพูดราวกับว่ามีวิธีที่ repo ควรจะทำนั่นเป็นวิธีที่ดีที่สุดในการทำธุรกรรมซื้อคืน; นี่เป็นความเข้าใจที่คลาดเคลื่อนเนื่องจากมี แต่วิธีหนึ่งในการทำธุรกรรมซื้อคืนสิ่งอื่น ๆ จะไม่เป็นธุรกรรมซื้อคืน รูปแบบการซื้อคืนเช่นนี้มีจุดแข็งและจุดอ่อน แต่ไม่มีวิธีการหลายวิธีในการซื้อคืน มีอยู่แต่หลายวิธีในการโต้ตอบกับข้อมูลของที่ซื้อคืนเป็นเพียงหนึ่ง อ่านที่นี่สำหรับวิธีการโต้ตอบข้อมูลอื่น ๆ
Jimmy Hoffa

คำตอบ:


13

คุณสามารถเห็นตัวอย่างที่ดีในSpring Data Frameworkซึ่งเป็นไปตามแนวคิดของที่เก็บ

ที่นั่นคุณจะเห็นที่เก็บข้อมูลจัดการกับที่เก็บข้อมูลเท่านั้นและไม่ค่อยมีตรรกะทางธุรกิจใด ๆ (ซึ่งสงวนไว้สำหรับชั้นบริการ) ตัวอย่างเช่นคุณลองดูการออกแบบของพวกเขาคุณจะเห็นว่าพวกเขามีส่วนต่อประสานCRUDRซึ่งเปิดเผยวิธีการในการสร้างทำลายและกู้คืนเอนทิตี (เหนือสิ่งอื่นใด) นอกจากนี้ยังมีPagingAndSortingRepositoryที่เพิ่มฟังก์ชันการทำงานพิเศษสำหรับการเรียงลำดับและผลลัพธ์การเพจเป็นต้น

ดังนั้นกรอบนี้อาจเป็นสถานที่ที่ดีในการศึกษาการออกแบบพื้นที่เก็บข้อมูลที่ดี

เท่าที่ฉันทราบแนวคิดหลายอย่างที่นำมาใช้โดย Spring Data Framework มาจากหนังสือยอดเยี่ยมที่เรียกว่าDomain-Driven Design: การแก้ปัญหาความซับซ้อนในหัวใจของซอฟต์แวร์หนังสือเล่มนี้มีเนื้อหาทั้งหมดเกี่ยวกับการออกแบบ Repository

คุณอาจพิจารณารับสำเนา

ข้อความที่ตัดตอนมาเล็กน้อยจากหนังสือเล่มนี้อธิบาย:

รูปแบบ REPOSITORY เป็นกรอบแนวคิดที่เรียบง่ายเพื่อห่อหุ้มโซลูชันเหล่านั้นและนำโฟกัสแบบจำลองของเรากลับมา

REPOSITORY หมายถึงวัตถุทั้งหมดของบางประเภทเป็นชุดแนวคิด (ปกติเลียนแบบ) มันทำหน้าที่เหมือนคอลเลกชันยกเว้นด้วยความสามารถในการสอบถามที่ซับซ้อนมากขึ้น วัตถุประเภทที่เหมาะสมจะถูกเพิ่มและนำออกและเครื่องจักรหลัง REPOSITORY จะแทรกหรือลบออกจากฐานข้อมูล คำจำกัดความนี้รวบรวมชุดของความรับผิดชอบที่เหนียวแน่นเพื่อให้สามารถเข้าถึงรากเหง้าของ AGGREGATES จากวงจรชีวิตในวัยเด็กจนถึงช่วงสุดท้าย

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

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

ดังนั้น:

สำหรับวัตถุแต่ละประเภทที่ต้องการการเข้าถึงระดับโลกให้สร้างวัตถุที่สามารถให้ภาพลวงตาของการรวบรวมในหน่วยความจำของวัตถุทั้งหมดของประเภทนั้น ตั้งค่าการเข้าถึงผ่านอินเทอร์เฟซส่วนกลางที่รู้จักกันดี

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


4

มันควรจะให้ทั้งอินเตอร์เฟซ CRUD ที่ตรงและไม่ใช้ตรรกะทางธุรกิจ มันเป็นสื่อกลางระหว่างตรรกะทางธุรกิจและฐานข้อมูล อินเทอร์เฟซควรอยู่ในเงื่อนไขทางตรรกะทางธุรกิจ แต่ไม่ได้ใช้ตรรกะทางธุรกิจเองเช่นเดียวกับตรรกะทางธุรกิจดั้งเดิม ตัวอย่างเช่นคุณกำลังจะสร้างระบบอีเมลคุณมีผู้ใช้และข้อความ ที่เก็บของคุณจะให้การดำเนินการ CRUD ขั้นพื้นฐานสำหรับผู้ใช้และข้อความ แต่จะให้มุมมองที่กรองของข้อความเช่น GetUsersNewMessages (ผู้ใช้) หรือ GetSearchedMessages (ผู้ใช้ searchTerms)

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

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