รูปแบบพื้นที่เก็บข้อมูลทีละขั้นตอนคำอธิบาย [ปิด]


276

ใครช่วยอธิบายแบบแผนพื้นที่เก็บข้อมูลใน NET ให้ฉันทีละขั้นตอนเป็นตัวอย่างหรือตัวอย่างที่ง่ายมาก

ฉันรู้ว่านี่เป็นคำถามที่พบบ่อยมาก แต่จนถึงตอนนี้ฉันยังไม่พบคำตอบที่น่าพอใจ



1
มีบทความที่ดีอยู่ที่นี่: deviq.com/repository-pattern
ssmith

คำตอบ:


199

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

บ่อยครั้งที่คุณจะพบแบบสอบถาม SQL ที่กระจัดกระจายอยู่ใน codebase และเมื่อคุณมาเพิ่มคอลัมน์ในตารางคุณต้องค้นหาไฟล์รหัสเพื่อลองและค้นหาประเพณีของตาราง ผลกระทบของการเปลี่ยนแปลงนั้นกว้างขวาง

ด้วยรูปแบบที่เก็บคุณจะต้องเปลี่ยนหนึ่งวัตถุและที่เก็บหนึ่ง ผลกระทบมีขนาดเล็กมาก

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

  • คุณมีที่เดียวสำหรับการเปลี่ยนแปลงการเข้าถึงข้อมูลของคุณ

  • คุณมีที่เดียวที่รับผิดชอบตารางชุดหนึ่ง (โดยปกติ)

  • มันง่ายที่จะแทนที่ที่เก็บด้วยการใช้งานปลอมสำหรับการทดสอบ - ดังนั้นคุณไม่จำเป็นต้องมีฐานข้อมูลสำหรับการทดสอบหน่วยของคุณ

มีประโยชน์อื่น ๆ เช่นถ้าคุณใช้ MySQL และต้องการเปลี่ยนไปใช้ SQL Server - แต่ฉันไม่เคยเห็นสิ่งนี้ในทางปฏิบัติ!


28
RE เปลี่ยนจาก dbms a เป็น b ฉันจะไปสู่การบันทึกที่ไม่เพียง แต่ฉันได้เห็นสิ่งนี้ฉันได้ทำในรหัสการผลิต ก่อนหน้านี้เราเคยใช้ Oracle ต้องเปลี่ยนผู้ให้บริการโฮสติ้งตัดสินบน Azure (ก่อนที่พวกเขาจะสนับสนุน Oracle) ดังนั้นเราจึงต้องแปลงเป็น SQL Azure น่าเสียดายที่เราไม่ได้แยกตรรกะการเข้าถึงข้อมูลทั้งหมด ณ จุดนั้น แต่แน่นอนว่าเราทำอย่างนั้นเมื่อเราทำการโยกย้ายนั้น (และต่อไปฉันอาจเพิ่ม)
Joe

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

อันที่จริงการใช้พื้นที่เก็บข้อมูล DAO สำหรับการดำเนินงานที่เกี่ยวข้องกับการเป็นแหล่งข้อมูล ...
Yousha Aleayoub

1
@YoushaAleayoub ว่าเป็นจุดที่ดีที่คุณยกระดับ โดยทั่วไปแล้วคุณจะพบ Data Access Objects เมื่อผู้ใช้พยายาม "แยกฐานข้อมูล" และที่เก็บข้อมูลเมื่อผู้ใช้พยายาม "ทำสิ่งเดียวที่รับผิดชอบการสืบค้น" ในเกือบทุกกรณีคุณจะพบทั้งสองอย่างพร้อมกัน ส่วนที่เป็น DAO IConnection, ICommandส่วน ฯลฯ ที่หนังประเภทของฐานข้อมูล พื้นที่เก็บข้อมูลมักจะเป็นศูนย์กลางของโดเมนมากกว่า
เฟนตัน

181

นี่เป็นตัวอย่างที่ดี: ตัวอย่างรูปแบบพื้นที่เก็บข้อมูลใน C #

โดยทั่วไปพื้นที่เก็บข้อมูลจะซ่อนรายละเอียดว่าข้อมูลถูกดึง / คงอยู่อย่างแน่นอนจาก / ไปยังฐานข้อมูล ภายใต้ผ้าห่ม:

  • สำหรับการอ่านมันจะสร้างแบบสอบถามที่เป็นไปตามเกณฑ์ที่ให้มาและส่งคืนชุดผลลัพธ์
  • สำหรับการเขียนมันจะออกคำสั่งที่จำเป็นเพื่อให้กลไกการคงอยู่ (เช่นฐานข้อมูล SQL) บันทึกข้อมูล

13
ตัวอย่างนี้เป็นคำอธิบายที่ดีที่สุดเท่าที่เคยมีมาดีกว่าเอกสาร MSDN
Teoman shipahi

2
ฉันพบสิ่งนี้ดีมาก นอกจากนี้ยังมีคำอธิบายที่เหมาะสมเกี่ยวกับหน่วยงานซึ่งดูเหมือนจะเป็นรูปแบบทั่วไปของรูปแบบข้อมูลมากกว่ารูปแบบพื้นที่เก็บข้อมูล
Celdor

8
ตัวอย่างที่เชื่อมโยงคือรูปแบบที่เก็บล้มเหลว มันไม่ได้เปรียบอะไรเลยเมื่อเทียบกับการใช้ส่วนต่อประสานที่จัดทำโดย Entity Framework ( IDbContext) หรือ nhibernate ( ISession) โดยตรง พื้นที่เก็บข้อมูลที่นำมาใช้อย่างถูกต้องเป็นนามธรรมเก็บข้อมูลที่มีอยู่เฉพาะทั้งหมด (เช่นวิธีการที่ผู้ให้บริการ Linq To Sql ปัจจุบันทำงาน) IQueryableเช่นไม่เคยเปิดเผย
jgauffin

3
@jgauffin IQueryableไม่ได้มีข้อมูลเฉพาะการคงอยู่ การสำรองข้อมูลของ IQueryable อาจเป็นเรื่องง่ายเหมือนอาเรย์ฮาร์ดโค้ดหรืออาจมาจากไฟล์ XML, บริการบนเว็บ, ฐานข้อมูล, ไฟล์แบบแบน ฯลฯ ฉันไม่แนะนำที่เก็บที่ไม่เปิดเผย IQueryable เช่นเคย นำไปสู่การเข้าถึงข้อมูลที่ช้าในทุกกรณีที่การเปิดเผย IQueryable จะช่วยให้อินสแตนซ์บางอย่างทำการปรับปรุงประสิทธิภาพซึ่งสามารถใช้งานได้หากที่เก็บข้อมูลมีความสามารถนั้น นอกจากนี้การซ่อน DbContext ช่วยให้คุณสามารถเปลี่ยนไปใช้ ORM อื่นหากต้องการ (หรือไม่มี ORM!)
Robert McKee

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