ดีสิ่งหนึ่งที่เป็นสิ่งสำคัญที่จะทำเมื่อใดก็ตามที่เรามีการอภิปรายเช่นนี้คือการแยกแยะความแตกต่างอย่างชัดเจนระหว่างทำแผนที่เชิงวัตถุสัมพันธ์ ( "ออม") และชั้น abstraction ฐานข้อมูล ORM เป็นเลเยอร์ abstraction ของฐานข้อมูล แต่เลเยอร์ abstraction ของฐานข้อมูลนั้นไม่ใช่ ORM ทั้งหมด เครื่องมือที่ดีอย่างหนึ่งในการศึกษาเพื่อเข้าใจสิ่งนี้คือคลังSQLAlchemyยอดนิยมของ Python ที่เก็บเงินตัวเองว่าเป็น "ชุดเครื่องมือ SQL และเครื่องมือทำแผนที่วัตถุสัมพันธ์" (ตัวหนาของฉัน) ด้วยแนวคิดที่ว่าสิ่งเหล่านี้แตกต่างกัน ตามที่วางไว้ในหน้าคุณสมบัติหลัก :
ไม่ต้องใช้ ORM
SQLAlchemy ประกอบด้วยสององค์ประกอบที่แตกต่างกันที่รู้จักกันเป็นหลักและการออม ตัวแกนหลักเป็นชุดเครื่องมือที่เป็นนามธรรมของ SQL อย่างสมบูรณ์โดยให้เลเยอร์ที่ราบรื่นของนามธรรมผ่านการใช้งานและพฤติกรรม DBAPI ที่หลากหลายรวมถึงภาษา SQL Expression Language ซึ่งช่วยให้การแสดงออกของภาษา SQL ผ่านนิพจน์ทั่วไปของไพ ธ อน ระบบการแทนสคีมาที่สามารถเปล่งคำสั่ง DDL เช่นเดียวกับการหยั่งรู้สคีมาที่มีอยู่และระบบประเภทที่ช่วยให้การแมปประเภทหลามใด ๆ กับประเภทฐานข้อมูลปัดเศษระบบ Object Relational Mapper นั้นเป็นแพ็คเกจเสริมที่สร้างขึ้นบนแกน
หน้าแรกอธิบาย ORM ดังนี้:
SQLAlchemy มีชื่อเสียงมากที่สุดสำหรับ object-relational mapper (ORM) ซึ่งเป็นส่วนประกอบทางเลือกที่จัดเตรียม data mapper pattern ซึ่งคลาสสามารถถูกแม็พกับฐานข้อมูลในปลายเปิดได้หลายวิธี - อนุญาตให้โมเดลวัตถุและสคีมาฐานข้อมูลพัฒนาใน แยกชิ้นส่วนอย่างหมดจดตั้งแต่ต้น
ความคิดที่สำคัญของการออมคือการพยายามและสะพานที่มีชื่อเสียงวัตถุสัมพันธ์ต้านทานไม่ตรงกัน ซึ่งหมายถึงการกำหนดความสัมพันธ์ระหว่างคลาสที่ผู้ใช้กำหนดให้กับตารางในสคีมาฐานข้อมูลและให้การดำเนินการ "บันทึก" และ "โหลด" โดยอัตโนมัติสำหรับคลาสของแอปพลิเคชันของคุณ
ในทางตรงกันข้ามเลเยอร์นามธรรมของเลเยอร์นามธรรมที่ไม่ใช่ ORM นั้นมีแนวโน้มที่จะมีความมุ่งมั่นมากขึ้นกับโมเดลข้อมูลเชิงสัมพันธ์และ SQL ดังนั้นแทนที่จะมี "การแมป" ระหว่างตารางและคลาสและซ่อนสคีมาฐานข้อมูลจากโปรแกรมเมอร์พวกเขามักจะเปิดเผยฐานข้อมูลไปยังโปรแกรมเมอร์ แต่มี API และ abstractions ที่ดีกว่า ตัวอย่างเช่นตัวสร้างเคียวรี SQL อนุญาตให้คุณสร้างเคียวรี SQL ที่ซับซ้อนโดยทางโปรแกรมโดยไม่มีการจัดการสตริงเช่นนี้ ( ตัวอย่างจากไลบรารี jOOQ สำหรับ Java ):
// Typesafely execute the SQL statement directly with jOOQ
Result<Record3<String, String, String>> result =
create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
.from(BOOK)
.join(AUTHOR)
.on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
.where(BOOK.PUBLISHED_IN.equal(1948))
.fetch();
ตอนนี้กรอบการเล่นดูเหมือนจะไม่ 100% ในลีกกับสิ่งที่ฉันเพิ่งอธิบายแต่ข้อโต้แย้งของพวกเขาดูเหมือนจะอยู่ในพื้นที่ทั่วไปนี้: ทำงานกับโมเดลเชิงสัมพันธ์โดยตรงแทนที่จะแปลเป็นคลาสและย้อนกลับจากพวกเขา
ห้องสมุด jOOQเป็นมูลค่าการศึกษาเป็นความแตกต่างที่จะ ORMs นอกจากนี้ยังมีรายการบล็อกที่เกี่ยวข้องที่ควรค่าแก่การอ่าน: