ORM คืออะไรทำงานอย่างไรและฉันควรใช้อย่างไร [ปิด]


230

มีคนแนะนำว่าฉันใช้ ORM สำหรับโครงการที่ฉันออกแบบ แต่ฉันมีปัญหาในการค้นหาข้อมูลว่ามันทำงานอย่างไร

ทุกคนสามารถให้คำอธิบายสั้น ๆ ว่า ORM คืออะไรและทำงานอย่างไรและฉันควรเริ่มใช้งานอย่างไร


8
ฉันพบคำถามนี้ แต่มาจาก 2009 และฉันไม่รู้ว่าคุณเป็นผู้เชี่ยวชาญ ORM แล้ว แต่มองหา Entity Framework ใน CodePlex C # ( entityframework.codeplex.com ) นี่คือซอร์สโค้ดที่คุณสามารถเรียนรู้ได้ นอกจากนี้คุณสามารถอ่านนี้ ( dbtechnet.org/labs/dae_lab/Orm.pdf )
Maximus Decimus

1
เพียงต้องการชี้ให้เห็นว่ากล้องลูกเบี้ยว ORM ยังเกี่ยวข้องกับการสร้างแบบจำลองบทบาทของวัตถุ en.wikipedia.org/wiki/Object-role_modeling
O-9

1
นี่เป็นคำถามที่มีประโยชน์และคะแนนโหวตสำหรับคำตอบยอดนิยมดูเหมือนจะยืนยันว่า คำอธิบายสั้น ๆ เกี่ยวกับสิ่งที่ ORM ไม่ต้องการความเห็น เพียงเพราะผู้ใช้ขอลิงค์เริ่มต้นคำถามถูกตั้งค่าสถานะเป็นปิดหัวข้อ ฉันรู้สึกว่านี่เป็นปฏิกิริยาที่เกิดขึ้นบ่อยครั้งจากผู้ดูแล
NeilG

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

1
@NeilG ปัญหาคือคำถามประกอบด้วยคำขอทรัพยากร (ทั้งในชื่อและคำถาม) คำขอดังกล่าวเป็นหัวข้อที่ไม่สำคัญเพราะส่งผลให้คนเพิ่งโพสต์ลิงค์ไปยังแหล่งข้อมูลที่ชื่นชอบดังที่เกิดขึ้นในหลายคำตอบที่นี่ การลบคำขอทรัพยากรออกจากคำถามจะทำให้คำตอบที่มีอยู่นั้นไม่ถูกต้อง ในฐานะผู้ใช้ทั่วไปเราไม่ได้รับอนุญาตให้แก้ไขคำถามเพื่อทำให้คำตอบไม่ถูกต้อง ดังนั้นจึงควรปิด หากคำถามยังไม่ได้รับคำตอบก็สามารถแก้ไขเพื่อลบคำขอเหล่านั้นและเปิดทิ้งไว้
Makyen

คำตอบ:


483

บทนำ

การทำแผนที่วัตถุเชิงสัมพันธ์ (ORM) เป็นเทคนิคที่ช่วยให้คุณค้นหาและจัดการข้อมูลจากฐานข้อมูลโดยใช้กระบวนทัศน์เชิงวัตถุ เมื่อพูดถึง ORM คนส่วนใหญ่จะอ้างถึงห้องสมุดที่ใช้เทคนิคการทำแผนที่วัตถุเชิงสัมพันธ์ดังนั้นวลี "เป็นออม"

ORM ไลบรารี่เป็นไลบรารี่ธรรมดาที่เขียนในภาษาที่คุณเลือกซึ่งจะห่อหุ้มโค้ดที่จำเป็นสำหรับจัดการข้อมูลดังนั้นคุณจะไม่ใช้ SQL อีกต่อไป คุณโต้ตอบโดยตรงกับวัตถุในภาษาเดียวกันกับที่คุณใช้

ตัวอย่างเช่นต่อไปนี้เป็นกรณีจินตนาการโดยใช้ภาษาหลอก:

คุณมีชั้นหนังสือที่คุณต้องการดึงหนังสือทั้งหมดที่ผู้แต่งคือ "ไลนัส" ด้วยตนเองคุณจะทำอะไรเช่นนั้น:

book_list = new List();
sql = "SELECT book FROM library WHERE author = 'Linus'";
data = query(sql); // I over simplify ...
while (row = data.next())
{
     book = new Book();
     book.setAuthor(row.get('author');
     book_list.add(book);
}

ด้วยไลบรารี ORM มันจะมีลักษณะเช่นนี้:

book_list = BookTable.query(author="Linus");

ชิ้นส่วนทางกลได้รับการดูแลโดยอัตโนมัติผ่านทางห้องสมุด ORM

ข้อดีและข้อเสีย

การใช้ ORM ช่วยประหยัดเวลาได้มากเนื่องจาก:

  • การอบแห้ง : คุณเขียนแบบจำลองข้อมูลของคุณในที่เดียวและง่ายต่อการปรับปรุงบำรุงรักษาและนำรหัสกลับมาใช้ใหม่
  • จำนวนมากของสิ่งที่จะทำโดยอัตโนมัติจากฐานข้อมูลการจัดการเพื่อI18N
  • มันบังคับให้คุณเขียนรหัสMVCซึ่งในที่สุดแล้วทำให้รหัสของคุณสะอาดขึ้นเล็กน้อย
  • คุณไม่จำเป็นต้องเขียน SQL ที่มีรูปแบบไม่ดี (โปรแกรมเมอร์เว็บส่วนใหญ่มักจะดูดมันเพราะ SQL นั้นถือว่าเป็นภาษา "sub" แต่ในความเป็นจริงแล้วมันมีประสิทธิภาพและซับซ้อนมาก)
  • ฆ่าเชื้อ; การใช้ข้อความหรือธุรกรรมที่เตรียมไว้นั้นง่ายเหมือนการเรียกวิธี

การใช้ไลบรารี ORM นั้นมีความยืดหยุ่นมากกว่าเนื่องจาก:

  • มันเหมาะกับวิธีการเขียนโค้ดแบบธรรมชาติ (เป็นภาษาของคุณ!)
  • มันเป็นนามธรรมระบบ DB เพื่อให้คุณสามารถเปลี่ยนได้ทุกเวลาที่คุณต้องการ
  • โมเดลถูกผูกไว้อย่างอ่อนกับส่วนที่เหลือของแอปพลิเคชันดังนั้นคุณสามารถเปลี่ยนหรือใช้ที่อื่นได้
  • มันช่วยให้คุณใช้ความดี OOP เช่นการสืบทอดข้อมูลโดยไม่ต้องปวดหัว

แต่ออมอาจเป็นความเจ็บปวด:

  • คุณต้องเรียนรู้และห้องสมุด ORM ไม่ใช่เครื่องมือที่มีน้ำหนักเบา
  • คุณต้องตั้งค่า ปัญหาเดียวกัน.
  • ประสิทธิภาพการทำงานก็โอเคสำหรับแบบสอบถามปกติ แต่ SQL Master จะทำได้ดีกว่าด้วย SQL ของตัวเองสำหรับโครงการขนาดใหญ่
  • มันเป็นนามธรรม DB ในขณะที่มันตกลงถ้าคุณรู้ว่าสิ่งที่เกิดขึ้นอยู่เบื้องหลังฉากที่มันเป็นกับดักสำหรับโปรแกรมเมอร์ใหม่ที่สามารถเขียนคำสั่งโลภมากเช่นตีหนักในforวง

จะเรียนรู้เกี่ยวกับ ORM ได้อย่างไร

ดีใช้หนึ่ง ไม่ว่าไลบรารี ORM ที่คุณเลือกจะใช้หลักการเดียวกันทั้งหมด มีไลบรารี ORM อยู่มากมายที่นี่:

หากคุณต้องการลองใช้ไลบรารี ORM ในการเขียนโปรแกรมเว็บคุณควรใช้เฟรมสแต็กทั้งหมดเช่น:

  • Symfony (PHP, ใช้ Propel หรือ Doctrine)
  • Django (Python ใช้ ORM ภายใน)

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


50

ทุกคนสามารถให้คำอธิบายสั้น ๆ กับฉัน ...

แน่ใจ

ORM ย่อมาจาก "การทำแผนที่วัตถุสัมพันธ์"

  • ส่วนของObjectเป็นชิ้นส่วนที่คุณใช้กับภาษาการเขียนโปรแกรมของคุณ (python ในกรณีนี้)

  • สัมพันธ์ส่วนหนึ่งเป็นฐานข้อมูลเชิงสัมพันธ์ System Manager (ฐานข้อมูลที่มี) มีชนิดอื่น ๆ ของฐานข้อมูล แต่ที่นิยมมากที่สุดคือความสัมพันธ์ (คุณรู้ตารางคอลัมน์ PK fk ฯลฯ เช่นออราเคิล MySQL, MS SQL)

  • และในที่สุดส่วนการทำแผนที่คือที่ที่คุณทำสะพานเชื่อมระหว่างวัตถุและตารางของคุณ

ในแอปพลิเคชันที่คุณไม่ได้ใช้เฟรมเวิร์ก ORM คุณทำได้ด้วยมือ การใช้เฟรมเวิร์ก ORM จะช่วยให้คุณลดจำนวน boilerplate ที่จำเป็นในการสร้างโซลูชัน

สมมุติว่าคุณมีวัตถุนี้

 class Employee:
      def __init__( self, name ): 
          self.__name = name

       def getName( self ):
           return self.__name

       #etc.

และโต๊ะ

   create table employee(
          name varcar(10),
          -- etc  
    )

การใช้เฟรมเวิร์ก ORM จะช่วยให้คุณแมปออบเจ็กต์นั้นด้วยระเบียน db โดยอัตโนมัติและเขียนสิ่งที่ชอบ

   emp = Employee("Ryan")

   orm.save( emp )

และให้พนักงานแทรกลงในฐานข้อมูล

โอ๊ะไม่สั้นขนาดนั้น แต่ฉันหวังว่ามันง่ายพอที่จะจับบทความอื่น ๆ ที่คุณอ่าน


17

ORM (Object Relational Mapper) คือส่วน / เลเยอร์ของซอฟต์แวร์ที่ช่วยแมปรหัสวัตถุของคุณไปยังฐานข้อมูลของคุณ

บางคนจัดการด้านต่างๆมากกว่าคนอื่น ๆ ... แต่จุดประสงค์คือการลดน้ำหนักของชั้นข้อมูลออกจากไหล่ของนักพัฒนา

นี่เป็นคลิปสั้น ๆ จาก Martin Fowler (Data Mapper):

รูปแบบของตัวแมปข้อมูลสถาปัตยกรรมแอปพลิเคชันองค์กร


4

เช่นเดียวกับตัวย่อทั้งหมดมันคลุมเครือ แต่ฉันคิดว่ามันหมายถึงผู้ทำแผนที่วัตถุเชิงสัมพันธ์ - วิธีปิดตาของคุณและทำให้เชื่อว่าไม่มี SQL อยู่ข้างใต้ แต่เป็นวัตถุทั้งหมด ;-) ไม่เป็นความจริงแน่นอนและไม่มีปัญหา - เจฟฟ์แอตวู้ดที่มีสีสันสดใสได้อธิบาย ORM ว่าเป็นVietnam of CS ;-) แต่ถ้าคุณรู้จัก SQL น้อยหรือไม่มีเลยและมีปัญหาง่ายๆ / ปัญหาเล็ก ๆ พวกเขาสามารถช่วยคุณประหยัดเวลาได้! -)


2

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

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