ORM เป็น Anti-Pattern หรือไม่ [ปิด]


58

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

แต่ฉันไม่ต้องการแสดงข้อโต้แย้งของตัวเองในเวลานี้ ดังนั้นฉันถามคุณคุณคิดอย่างไรเกี่ยวกับออม? ข้อดีและข้อเสียคืออะไร?


3
คุณได้อ่านสิ่งนี้แล้ว: seldo.com/weblog/2011/08/11/orm_is_an_antipattern ?
FrustratedWithFormsDesigner

2
ใช่. ถ้าคุณไม่มีแอพพลิเคชั่น CRUD ทั่วไปที่ไม่ได้ทำอะไรที่มีคุณค่ากับฐานข้อมูลซึ่งในกรณีนี้คุณไม่ควรใช้ฐานข้อมูลเชิงสัมพันธ์
Raynos

1
@derphil: คุณอาจต้องการทำให้มันกว้างน้อยลงมิฉะนั้นจะถูกปิด หากคุณเชื่อว่าเป็นรูปแบบการต่อต้านอาจระบุสาเหตุแล้วถามในสถานการณ์ที่รูปแบบการต่อต้านนี้เหมาะสม (แต่อาจยังกว้างเกินไป)
FrustratedWithFormsDesigner

2
@ เดอร์ฟิลมีการโต้เถียงมากมายในความคิดเห็นที่โพสต์บล็อกนั้นคุณอ่านมาแล้วหรือยัง
PéterTörök

2
และเป็นหลักฐานว่าทำไมคุณไม่ต้องการ ORM: medium.com/@wrong.about/you-dont-need-an-orm-7ef83bd1b37d
Zapadlo

คำตอบ:


83

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

  • ที่ไม่ตรงกัน
    • แนวคิดเชิงวัตถุ
    • ความแตกต่างของชนิดข้อมูล
    • ความแตกต่างด้านโครงสร้างและความสมบูรณ์
    • ความแตกต่างที่บิดเบือน
    • ความแตกต่างของการทำธุรกรรม
  • การแก้ปัญหาความต้านทานไม่ตรงกัน
    • ลด
    • สถาปัตยกรรมทางเลือก
    • ค่าตอบแทน
  • การต่อสู้
  • ความแตกต่างทางปรัชญา

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

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

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

นอกหลักสูตรเนื่องจากทุกอย่างมีประโยชน์ ORM มีแนวโน้มที่จะถูกละเมิด ถ้าคุณคิดว่ามันจะมาแทนที่ความต้องการที่จะรู้ทุกอย่างเกี่ยวกับฐานข้อมูลที่คุณทำงานอยู่มันจะกลับมากัดคุณ ยาก

ในที่สุดขอให้ฉันเสียบอีกหนึ่งคำตอบของฉันลงใน"รูปแบบ ActiveRecord ตาม / สนับสนุนหลักการออกแบบ SOLID หรือไม่" คำถามซึ่งสำหรับฉันเป็นคำถามที่เกี่ยวข้องมากกว่า "มันเป็นรูปแบบการต่อต้าน"


5
+1 สำหรับการทำงานในวลี "อิมพิแดนซ์ไม่ตรงกัน" Buzzwords สำหรับ geeks แต่ฉันก็ชอบพวกเขาเช่นกัน!
hardmath

เห็นด้วยอย่างยิ่ง ... ตรวจสอบลิงค์นี้เพื่ออธิบายได้ดี: seldo.com/weblog/2011/08/11/orm_is_an_antipattern
sandino

42

นี่คล้ายกับการถามว่า "สว่านไฟฟ้าเป็นแบบป้องกันหรือไม่" ORMs ได้รับตำแหน่งที่ดีในกล่องเครื่องมือของฉันลดรหัสต้นแบบและฉันยังสามารถใช้ SQL แบบกำหนดเองได้หากจำเป็น ดังนั้นถ้ามันเป็นรูปแบบการต่อต้านมันเป็นรูปแบบที่ต่อต้าน?

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


11
+1 ฉันก็คิดว่ามันมีประโยชน์มากมีการเรียนรู้โค้ง แต่มันเป็นเรื่องดีมากที่ไม่ต้องเติม pojos ด้วยตนเอง ฯลฯ
NimChimpsky

18

ฉันอยากจะเรียกบางอย่างว่า "anti-pattern" ซึ่งถูกเรียกเป็นครั้งแรกโดย Martin Fowler และตั้งแต่นั้นมาก็ถูกนำมาใช้ในภาษาการเขียนโปรแกรมสมัยใหม่เกือบทุกภาษา (ดูบทความ Wikipedia บน ActiveRecord )

ORM ที่ดีสามารถนำไปสู่รหัสน้อยลง (และซ้ำซ้อนน้อยกว่า) ในโครงการและไม่มีอะไรที่มีความสัมพันธ์อย่างยิ่งกับข้อบกพร่องเป็นจำนวนรหัสต้นฉบับ

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


12
"ฉันลังเลที่จะต่อต้านการโต้เถียงโดยผู้มีอำนาจ"
Raynos

3
@Raynos: คุณหมายถึง ... คุณกำลังพูดว่า ... ฟาวเลอร์อาจจะผิด .... ผิด??! ช็อกและอ้าปากค้างบาป! ดูหมิ่น !! : P;)
FrustratedWithFormsDesigner

9
@ Raynos - บางทีอำนาจไม่ใช่อาร์กิวเมนต์ที่ดีที่สุด แต่ OP กล่าวว่า "จากประสบการณ์ของฉัน" นี่คือการอุทธรณ์ต่อผู้มีอำนาจส่วนบุคคลดังนั้นฉันคิดว่ามันสมเหตุสมผลที่จะตอบโต้การอุทธรณ์ต่อผู้มีอำนาจและฉันทามติ นอกจากนี้คำว่า "แอนตี้ - ลวดลาย" นั้นเกี่ยวกับความคิดเห็น ฉันได้ยกตัวอย่างสิ่งที่คนอื่นคิด
Nathan Long

3
@ นาธานลองฉันแค่ชี้ให้เห็นว่าความนิยมและความถูกต้องเป็นมุมฉาก
Raynos

1
FWIW Data Mapper อาจเป็นรูปแบบที่ใกล้เคียงที่สุดกับแผนที่ ORM ActiveRecord เป็นรูปแบบที่แตกต่างกัน แต่เกี่ยวข้องกันอย่างแน่นอน
JasonTrue

11

การใช้ ORM แทนการเรียนรู้ SQL เป็นความคิดที่ไม่ดี หากคุณไม่ทราบประเภทของ SQL ที่ถูกสร้างขึ้นอย่างแน่นอนหากคุณไม่เข้าใจปัญหา N + 1 และวิธีการปรับให้เหมาะสมมันจะทำให้เกิดอันตรายมากกว่าแน่นอน ฉันรู้สึกว่าฉันมีประสิทธิภาพมากขึ้นโดยใช้ ORM ฉันชอบ Rails ActiveRecord ซึ่งไม่พยายามที่จะแสร้งว่าไม่มีฐานข้อมูลและไม่สามารถเข้าถึงได้ถ้าคุณต้องการเขียน SQL ฉันกังวลว่าบางคนอาจเชื่อในสำนวนที่พวกเขาเห็นอย่างลึกซึ้งเกินไปโดยไม่เข้าใจในสิ่งที่พวกเขาทำ


11

ประสบการณ์ของฉัน: ฉันใช้ NHibernate กับ Linq2NHibernate

ข้อดี:

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

จุดด้อย:

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

ฉันจะบอกว่ามันไม่ได้ขึ้นอยู่กับสัญญาที่คนส่วนใหญ่หวังในตอนแรก ฉันจะไม่โทษใครบางคนที่บอกว่ามันเป็นรูปแบบต่อต้าน ฉันพบว่าในกรณีของฉันฉันยังต้องทำการทดสอบการรวมกับฐานข้อมูล SQLite เพื่อให้แน่ใจว่าการสืบค้น Linq2NHibernate ของฉันใช้งานได้จริง ดังนั้นหากคุณทำการทดสอบการรวมกับฐานข้อมูลเชิงสัมพันธ์จริง ๆ แล้วการกำจัดแบบนั้นจะช่วยขจัดปัญหาด้วย "สายอักขระเวทมนต์"

ถ้าฉันจะเริ่มโครงการใหม่ฉันไม่แน่ใจว่าฉันจะใช้ ORM หรือไม่ ฉันอาจจะ แต่ฉันไม่สามารถพูดได้ว่าคุณควร ฉันจะบอกว่ามันเหมือนกับความแตกต่างระหว่างการเลือก C ++ หรือ Java / .NET สำหรับโครงการของคุณ: คุณต้องการความยืดหยุ่นที่คุณได้รับจากการทำงานในระดับที่ต่ำกว่าหรือคุณต้องการทำงานในระดับที่สูงขึ้นและ (ควรจะมากกว่า) การผลิต? คำตอบปกติในการทำงานที่สูงของระดับที่คุณได้รับไปด้วย ซึ่งมักจะหมายถึงการใช้ ORM


6

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

จุดอ่อนคือจำนวนคนที่จริง ๆ แล้วการเขียนโปรแกรมเชิงวัตถุจริงๆมีขนาดค่อนข้างเล็ก ผู้คนจำนวนมากเขียนสปาเก็ตตี้และลูกชิ้นด้วยวัตถุที่มีการเชื่อมโยงกันสูงซึ่งมีพฤติกรรมเล็กน้อยของพวกเขาเองและพฤติกรรมจริง ๆ จบลงด้วยคลาส "Service" และ "Manager" ที่น่าเกลียด 8000 บรรทัดและรหัสนั้นมักจะสับสนจนทุกคนกลัว ของการเปลี่ยนแปลงเพราะพวกเขาไม่สามารถเข้าใจได้ว่าผลข้างเคียงจะเป็นอย่างไร

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

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

ORM จะไม่ทำให้คุณฉลาดขึ้น แต่อยู่ในมือของนักพัฒนาซอฟต์แวร์ที่เหมาะสมสามารถนำไปสู่รหัสที่รักษาได้และมีคุณภาพสูงขึ้น


ฉันคิดว่าสิ่งนี้ทำให้เกิดความสับสนโดยใช้ ORM เป็นรูปแบบสำหรับการเข้าถึงฐานข้อมูลและ ORM เป็นตัวสร้างรหัสแฟนซีเพื่อทำให้การเข้าถึงฐานข้อมูลง่ายขึ้นและดีขึ้น
gbjbaanb

ฉันไม่แน่ใจว่าคุณหมายถึงอะไร ความคิดเห็นของคุณไม่สมเหตุสมผลกับฉัน
JasonTrue

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

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

5

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

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


1
ในขณะที่ฉันยอมรับว่าการใช้ฐานข้อมูลเชิงสัมพันธ์ถ้าคุณไม่ต้องการมันเป็นความคิดที่ไม่ดีจนถึงทุกวันนี้ถ้าคุณใช้มันคุณจะต้องใช้ ORM ที่น่าหัวเราะ!
HLGEM

1
อืมแล้วคุณจะนำข้อมูลเข้าและออกจากฐานข้อมูลได้อย่างไร บางสิ่งบางอย่างจะต้องแมปวัตถุของคุณกับโครงสร้างเชิงสัมพันธ์และสร้างพวกเขาอีกครั้งเมื่อพวกเขาอ่านจากฐานข้อมูล แม้ว่าคุณจะเขียนคำสั่งด้วยตนเองและคัดลอกข้อมูลเข้าและออกจากชุดผลลัพธ์คุณก็กำลังทำ ORM
TMN

1
การใช้ procs ที่เก็บไว้ (วิธีเดียวที่ยอมรับได้ในการแทรกข้อมูลทางการเงินใด ๆ เพื่อการควบคุมภายใน) เพื่อทำการจัดการฐานข้อมูลทั้งหมดไม่ใช่ ORM ในใจของฉัน ฉันไม่เคยเห็นคุณค่าใด ๆ ของ ORM สำหรับคนที่รู้จัก SQL จริง ๆ ฉันไม่เคยทำงานกับระบบ (และฉันทำงานกับแอปพลิเคชันระดับองค์กรที่ซับซ้อนมาก) ซึ่งขึ้นอยู่กับ ORM อย่างมากพวกเขาก็ไม่ดีพอเมื่อสิ่งที่คุณทำมีความซับซ้อน
HLGEM

6
@HLGEM: แล้วข้อมูลที่คุณได้จากฐานข้อมูลล่ะ? เมื่อคุณเคียวรีฐานข้อมูลเชิงสัมพันธ์คุณไม่แม็พผลลัพธ์กับอ็อบเจ็กต์หรือไม่? จากประสบการณ์ของฉันมีโครงการสองประเภทที่ใช้ฐานข้อมูลเชิงสัมพันธ์: โครงการที่ใช้ ORM ของบุคคลที่สามและโครงการที่มี ORM ที่สร้างขึ้นเองไม่ดี
Carson63000

2
+1 คาร์สัน คุณใช้ ORM บางชนิดไม่ว่าจะเกิดอะไรขึ้นถ้าคุณเพียงแค่คืนค่า DataSets ดิบและปลาสเตอร์เหล่านั้นให้อยู่เหนือรหัสของคุณ (ความผิดร้ายแรงที่สุดของ IMHO ทั้งหมด) เนื่องจากคุณจะต้องแมปผลลัพธ์ของกระบวนงานที่เก็บไว้ในชั้นเรียนเสมอ ออมทำเพื่อคุณ
Wayne Molina

4

ORM เป็นเครื่องมือ เช่นเดียวกับเครื่องมือทั้งหมดเมื่อใช้อย่างเหมาะสมพวกเขาทำงานได้ค่อนข้างดี เมื่อใช้อย่างไม่เหมาะสมจะต้องใช้ค้อนที่ใหญ่กว่าและเทปพันท่อ

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

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