ประโยชน์ของ“ Micro-ORM” คืออะไร?


21

ฉันได้มองหาสิ่งที่เรียกว่า "Micro ORMs" เช่น Dapper และ (ในระดับที่น้อยกว่าเนื่องจากอาศัย. NET 4.0) ขนาดใหญ่เนื่องจากสิ่งเหล่านี้อาจจะง่ายต่อการใช้งานในที่ทำงานมากกว่า ORM แบบเต็มเป่าตั้งแต่ระบบปัจจุบันของเรา มีความเชื่อมั่นอย่างสูงในขั้นตอนการจัดเก็บและจะต้องมีการปรับโครงสร้างที่สำคัญในการทำงานกับ ORM เช่น NHibernate หรือ EF ประโยชน์ของการใช้หนึ่งในสิ่งเหล่านี้ผ่าน ORM ที่มีคุณลักษณะครบถ้วนคืออะไร ดูเหมือนว่าเป็นเพียงเลเยอร์เล็ก ๆ รอบ ๆ การเชื่อมต่อฐานข้อมูลที่ยังคงบังคับให้คุณเขียน SQL ดิบ - บางทีฉันผิด แต่ฉันก็มักจะบอกเหตุผลของ ORMs ตั้งแต่แรกคือคุณไม่ต้องเขียน SQL มัน สามารถสร้างขึ้นโดยอัตโนมัติ โดยเฉพาะอย่างยิ่งสำหรับการรวมหลายตารางและความสัมพันธ์ในการจับคู่ระหว่างตารางซึ่งเป็นความเจ็บปวดที่ต้องทำใน SQL บริสุทธิ์ แต่ไม่สำคัญกับ ORM

ตัวอย่างเช่นการดูตัวอย่างของ Dapper:

var connection = new SqlConnection(); // setup here...
var person = connection.Query<Person>("select * from people where PersonId = @personId", new { PersonId = 42 });

จะแตกต่างจากการใช้เลเยอร์ข้อมูล ADO.NET แบบ handrolled ได้อย่างไรยกเว้นว่าคุณไม่จำเป็นต้องเขียนคำสั่งตั้งค่าพารามิเตอร์และฉันคิดว่าการแมปเอนทิตีกลับมาโดยใช้ตัวสร้าง ดูเหมือนว่าคุณสามารถใช้การเรียกโพรซีเดอร์ที่เก็บไว้เป็นสตริง SQL ได้

มีประโยชน์ที่จับต้องได้อื่น ๆ ที่ฉันขาดไปจากที่นี่ที่ Micro ORM เหมาะสมหรือไม่? ฉันไม่ได้เห็นว่ามันช่วยอะไรได้บ้างในแบบ "เก่า" ของการใช้ ADO.NET ยกเว้นรหัสบางบรรทัด - คุณยังต้องเขียนเพื่อคำนวณว่า SQL ที่คุณต้องใช้ในการประมวลผล (ซึ่งอาจมีขนดก) และ คุณยังต้องแมปความสัมพันธ์ระหว่างตาราง (ส่วนที่ IMHO ORMs ช่วยมากที่สุดด้วย)


+1: คุณยังต้องใช้ภาษาคิวรีไม่ว่าจะเป็นอะไรดังนั้นคุณอาจยึดติดกับสิ่งที่คุ้นเคยเช่น linq หรือ sql แต่การคืนค่าประเภทนิรนามเช่นในตัวอย่างของคุณดูเหมือนจะไม่แมปโมเดลเชิงสัมพันธ์กับโดเมนที่เชื่อมโยงกัน แบบ นั่นเป็นสิ่งที่แปลกสำหรับฉัน
Steven Evers

ใช่ฉันไม่พบตัวอย่างที่เป็นรูปธรรมของ Dapper บนเว็บไซต์เพราะมันทำตามตัวอักษรvar dog = connection.Query<Dog>("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid });และdog.First().Ageเข้าถึงคุณสมบัติ
Wayne Molina

5
ตัวอย่างจะไม่ส่งคืนชนิดที่ไม่ระบุชื่อคำหลัก "var" สามารถใช้แทนประเภทคอนกรีตใน C # เพื่อบันทึกการพิมพ์พิเศษแบบสอบถามนั้นจะส่งคืน IEnumerable <Person>
Ed James

1
เหตุผลหลักคือค่าใช้จ่ายน้อยลงที่ต้องตรวจสอบ sprocs อยู่ตลอดเวลาจากนั้นอย่าลืมอัปเดตไฟล์ SQL สองโหลบางไฟล์
Wayne Molina

2
ประโยชน์หลักที่จะไม่ใช้ sprocs เพื่อรักษารหัสทั้งหมด (และฉันใช้รหัสตามวัตถุประสงค์ที่นี่รวมถึง SQL และภาษาอื่น ๆ ที่คุณเลือก) ในระบบควบคุมเวอร์ชันเดียวกัน ฉันยังไม่เจอ VCS ฐานข้อมูลข้ามฐานข้อมูลที่ดี
Ed James

คำตอบ:


12

ประโยชน์ที่ได้รับ:

  • ประสิทธิภาพที่คล้ายกันกับ SqlCommand ดิบที่มี DataReader และการแยกวิเคราะห์
  • ไม่จำเป็นต้องม้วนเลเยอร์การแปลงของคุณเองสำหรับ DataReader

มันค่อนข้างจะซื่อสัตย์ คุณมี wrapper เบามากกับการเชื่อมต่อ sql ของคุณที่จะทำการแปลงวัตถุสำหรับคุณ คุณสามารถปรับแต่งแบบสอบถามอย่างชัดเจนโดยไม่ต้องจัดการกับ SQL ที่สร้างอัตโนมัติใด ๆ

จุดด้อย:

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

พวกเขามีที่ของพวกเขาและพวกมันเป็นเครื่องมือที่มีประสิทธิภาพมากที่สามารถกำจัด "งานลา" บางส่วนจากนักพัฒนาเมื่อโต้ตอบกับ DB แต่ในความเป็นจริงพวกเขาไม่สามารถแทนที่ ORM เต็มรูปแบบในขนาดใหญ่ ระบบสำหรับการสืบค้นที่ไม่สำคัญกับประสิทธิภาพเพียงเพราะค่าบำรุงรักษาที่เพิ่มขึ้น

หากคุณกำลังดิ้นรนกับประสิทธิภาพในการค้นหา DB ฉันขอแนะนำให้ใช้เฟรมเวิร์กการแมปเหล่านี้กับ Stored Procedure เท่านั้นเพื่อให้ได้ตัวบ่งชี้เวลาคอมไพล์ว่า SQL ของคุณนั้นถูกต้องหรือไม่ .


มีห้องสมุดที่สามารถใช้เป็น wrapper สำหรับ micro orms เหล่านี้ซึ่งสามารถลดปัญหาที่คุณพูดถึงด้วยการพิมพ์ผิด เช่น Add-on Crud ง่าย ๆ สำหรับ Dapper
Srivathsa Harish Venkataramana

3

ในเว็บไซต์ของ micro ORM PetaPocoเขาอธิบายถึงความได้เปรียบกับ ORM อื่น ๆ เพื่ออธิบายเพิ่มเติม

PetaPoco เป็น micro-ORM ไฟล์เดียวขนาดเล็กที่รวดเร็วสำหรับ. NET และ Mono

  • Like Massive เป็นไฟล์เดียวที่คุณสามารถเพิ่มลงในโครงการใด ๆ ได้อย่างง่ายดาย
  • ไม่เหมือน Massive มันใช้งานได้กับ POCO ที่พิมพ์ออกมาอย่างแรง
  • เช่นเดียวกับ Massive ตอนนี้มันยังรองรับ Expandos แบบไดนามิกเช่นกัน - อ่านเพิ่มเติม
  • เช่น ActiveRecord รองรับความสัมพันธ์ใกล้ชิดระหว่างวัตถุและตารางฐานข้อมูล
  • เช่นเดียวกับ SubSonic รองรับการสร้างคลาส poco ด้วยเทมเพลต T4
  • เช่น Dapper มันเร็วเพราะใช้วิธีสร้างแบบไดนามิก (MSIL) เพื่อกำหนดค่าคอลัมน์ให้กับคุณสมบัติ

1

จะแตกต่างจากการใช้เลเยอร์ข้อมูล ADO.NET แบบ handrolled ได้อย่างไรยกเว้นว่าคุณไม่จำเป็นต้องเขียนคำสั่งตั้งค่าพารามิเตอร์และฉันคิดว่าการแมปเอนทิตีกลับมาโดยใช้ตัวสร้าง ดูเหมือนว่าคุณสามารถใช้การเรียกโพรซีเดอร์ที่เก็บไว้เป็นสตริง SQL ได้

ฉันเชื่อว่านี่เป็นประโยชน์หลักของ Micro-ORM เพื่อรับประโยชน์อื่น ๆ ของ ORM ที่คุณจะต้องใช้แบบเต็มเป่า และรหัสนั้นมีขนาดค่อนข้างเล็กดังนั้นหากคุณต้องการปรับแต่งมันจะง่ายขึ้น

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