ประโยชน์ของการใช้ฐานข้อมูลนามธรรมโดย ORM คืออะไร [ปิด]


19

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

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

ถ้าฉันรู้ว่าในระยะยาวฉันจะไม่เปลี่ยนฐานข้อมูลพื้นฐาน ทำไมไม่เข้าถึงคุณลักษณะเฉพาะฐานข้อมูลด้วย


2
+1: น่าสนใจมาก ฉันมักจะเป็นผู้สนับสนุน ORMs แต่ฉันมักจะถือว่า RDBMS 'เท่ากัน (ซึ่งฉันเพิ่งเริ่มเห็นผิด)
Steven Evers

ดูเหมือนว่าคุณต้องการการยืนยันความคิดเห็นของคุณเอง บล็อกอาจเหมาะกับคุณมากกว่าเว็บไซต์ถาม - ตอบ

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

คำตอบ:


14

ฉันเห็นมันในลักษณะเดียวกัน สิ่งที่เป็นนามธรรมที่ไม่อนุญาตให้คุณเข้าไปอยู่ข้างใต้เมื่อจำเป็นคือความชั่วร้ายเพราะมันจะนำไปสู่การรุกรานที่น่าเกลียดในรหัสของคุณทุกประเภท

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

IMO ORM ใด ๆ ที่ไม่มีคุณสมบัตินี้ไม่คุ้มค่าบิตที่รวบรวมจาก


drops it directly into the query it's generatingฟังดูน่าสนใจ. คุณรู้ไหมว่าใช้เวลานานแค่ไหนในการเขียน ORM พื้นบ้านนี้? ฉันต้องการที่จะเห็นบางสิ่งบางอย่างเช่นนี้ในหนึ่งใน ORM โอเพนซอร์สที่นั่น
jblue

+1 การทำงานกับแอปพลิเคชันที่สำคัญที่สุดของฉัน (ข้อมูล) เป็นสิ่งสุดท้ายที่ฉันต้องการสรุปและขาดการเชื่อมต่อ
Fosco

1
ฉันชอบที่จะสามารถดำน้ำใต้เมื่อมีความจำเป็นตราบใดที่การดำน้ำนั้นเกี่ยวข้องกับการข้ามรั้วอุปมาอุปมัย: "นี่คือมังกรดูขั้นตอนของคุณ"
Frank Shearar

1
@Jblue: ไม่มีความคิด มันเขียนเมื่อหลายปีก่อนนานก่อนที่ฉันจะได้รับการว่าจ้าง พวกเขาตั้งค่า ORM ก่อนที่ใครจะใช้คำนั้น มันมักจะเรียกว่า "the Object Model" ใน codebase ของเรา
Mason Wheeler

3
ฉันเห็นด้วย. สำหรับสิ่งพื้นฐานและปกติ ORMs มีประโยชน์มาก แต่บางครั้งคุณจำเป็นต้องลึกลงไปอีกเล็กน้อยและถ้า ORM ไม่ให้ความสามารถนั้นมันก็เป็นอีกปัญหาหนึ่งสำหรับคุณ
Nikos Steiakakis

14

ORM ใช้ตัวหารร่วมที่ต่ำที่สุด

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

บันทึกย่อ: คุณพูดถึงสิ่งที่เป็นนามธรรมเท่านั้น นั่นเป็นหนึ่งในผลประโยชน์มากมาย แต่ฉันคิดว่าคุณสมบัติเชิงวัตถุมีประสิทธิภาพมากขึ้น (เช่น: การสืบทอด) และYou design your domain model first...

... กลับไปที่สิ่งที่เป็นนามธรรม มันไม่ใช่ตัวส่วนร่วมที่ต่ำที่สุด ในnHibernateคุณมีภาษาถิ่น จะช่วยให้คุณใช้รหัสเดียวกันเพื่อสอบถามฐานข้อมูลที่แตกต่างกัน ภาษาถิ่นดูแลการจัดการคุณสมบัติสำหรับคุณ a given dialect will try to use all the power of a given database systemคำสั่งที่ถูกต้องคือ

ในฐานะที่เป็นตัวอย่างใช้SqlServer2005ภาษาที่เมื่อนำมาใช้คือการใช้ประโยชน์จากคุณลักษณะการเพจจิ้ง SQL Server 2005 ใหม่ การใช้ภาษาถิ่นนั้นแทนที่จะSqlServer2000เพิ่มการแสดงของคุณ

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


+1 สำหรับการสนับสนุน NHibernate บิตของเส้นโค้งการเรียนรู้เมื่อเทียบกับ ORM อื่น ๆ แต่ความพยายามนั้นคุ้มค่า
richeym

1
ฉันต้องการรับฟังข้อมูลจาก DBA บ้างไหม ในงานสุดท้ายของฉันไฮเบอร์เนตไม่มีอะไรนอกจากปัญหา (SQL ที่สร้างขึ้นมันน่าขยะแขยงอย่างแน่นอน)
Fosco

+1 สำหรับความคิดเห็นนี้ มันเป็นจุดที่ เมื่อคุณเริ่มเปรียบเทียบพลังของ ORM ที่ดีเช่น nHibernate (ด้วยการแคช, lazy-loading, ฯลฯ ) คุณจะเห็นว่าทำไมนามธรรมนี้ถึงดีและทำไมความต้องการเฉพาะฐานข้อมูลของคุณจึงมีความสำคัญน้อยกว่า
Chris Holmes

1
Fosco ให้โอกาสอีกครั้งกับการจำศีล เช่นเดียวกับ technoloy อื่น ๆ คุณต้องเข้าใจสิ่งที่เกิดขึ้นภายในเพื่อใช้งานอย่างถูกต้อง

+1, ORM เป็นจุดตัดสูงสุดของสิ่งที่ Java สามารถทำได้กับสิ่งที่ไดรเวอร์ JDBC โดยเฉพาะสามารถทำได้ คุณมีอิสระที่จะเลือกจำนวนเงินลงทุนที่คุณต้องการทำในชั้นการคงอยู่ของใบสมัครของคุณ
bobah

5

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

ดังนั้นฉันเดาคำถามที่ควรจะเป็นก่อนที่คุณจะกระโดดเข้าที่:

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

จากนั้นเลเยอร์นามธรรมพิเศษจะมีผลกระทบกับแอพหรือไม่ มันจะช้ากว่า SQL ที่เขียนด้วยมือหรือไม่


5

O / RM ถูกวิจารณ์อย่างสม่ำเสมอ Ted Neward เรียกมันว่า " Vietnam of Computer Science " เมื่อไม่กี่ปีที่ผ่านมา O / RM

เริ่มต้นได้ดีขึ้นมีความซับซ้อนมากขึ้นเมื่อเวลาผ่านไปและอีกไม่นานจะทำให้ผู้ใช้มุ่งมั่นที่ไม่มีจุดแบ่งที่ชัดเจนไม่มีเงื่อนไขการชนะที่ชัดเจนและไม่มีกลยุทธ์การออกที่ชัดเจน

หากคุณไม่ได้เขียนการแมปเฉพาะกิจ (ซึ่งเป็นวิธีแก้ปัญหาที่ดีในหลาย ๆ กรณีตามที่ได้กล่าวไปแล้ว) คุณสามารถดูทางเลือกอื่น ๆ เช่นการใช้ฐานข้อมูลที่ไม่เกี่ยวข้อง บางคนบอกว่าฐานข้อมูลวัตถุจริงดีกว่า buzzwords อื่น ๆ ที่กล่าวถึงในบริบทนี้คือ LINQ, Ruby และ Tutorial D. ฉันคิดว่าตรงกันข้ามกับฐานข้อมูลเชิงสัมพันธ์อย่างแท้จริงมีฐานข้อมูลวัตถุจริง แต่ในทางปฏิบัติแล้วฉันพบว่าการสร้างแบบจำลองข้อมูลแนวคิด - นั่นคือการค้นหาวัตถุในโลกแห่งความจริงที่คุณต้องการจัดเก็บข้อมูลเกี่ยวกับและวัตถุเหล่านี้เกี่ยวข้องกับกันและกันอย่างไร - มีความสำคัญยิ่งกว่า ภาษาโปรแกรมหรือฐานข้อมูล


2
เยี่ยมมากอ่านที่นี่ ฉันมีอาชีพการงานที่ครบวงจรและได้นำเอาโมเดลเชิงสัมพันธ์ที่ประสบความสำเร็จมาใช้อีกครั้ง
Jé Queue

2
+1 @Xepoch - ฉันมีเรื่องเกี่ยวกับรูปแบบล่าสุด: ORMs - ทำไม SQL ถึงถูกทิ้งให้เย็น? เป็นนามธรรมแน่นอน - แต่ ORM ดูเหมือนจะส่งเสริมความหวาดกลัวของ SQL
sunwukung

1
@ sunwukung ฉันไม่เห็นด้วยเสมอไป แต่ตอนนี้ฉันเชื่อว่า SQL ควรได้รับการพิจารณาว่าเป็นเลเยอร์ตรรกะระดับที่หนึ่งไม่ใช่แค่บางสิ่งที่ใช้เป็นโปรโตคอลลวด
Jé Queue

3

ทางเลือกคืออะไร

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

ในตอนท้ายของวันคุณต้องถามตัวเองว่า - อะไรคือทางเลือก?

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


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

6
@Matt: RDBMS มีความพยายามและพิสูจน์แล้วว่าเป็นเทคโนโลยีที่เข้าใจดี มีผู้คนมากมายที่มีประสบการณ์กับพวกเขาและเครื่องมือของบุคคลที่สามจำนวนมาก จากมุมมองขององค์กรมีคุณค่ามากมายเมื่อคุณจัดการกับบางสิ่งที่มีค่ายิ่งเช่นข้อมูลของคุณ ในโครงการขนาดเล็กยังคงมีคุณค่าในการเริ่มโครงการ (เช่นบริการเว็บ LAMP) และมีซอฟต์แวร์ส่วนใหญ่อยู่ที่นั่นและมีเอกสารที่ดี
David Thornley

3

ORM นั้นโดยทั่วไปจะเป็น " Unstored กระบวนงาน " ฉันประกาศคำหนึ่งคำ

ทุกสิ่งที่ ORM ทำคุณสามารถทำซ้ำกับวิวทริกเกอร์และกระบวนงานที่เก็บไว้ พวกเขาช่วยแยก SQL ดิบออกไปและสามารถทำให้ฐานข้อมูลปกติสอดคล้องกัน แต่ใช้งานได้ดีกับกรณีง่าย ๆ เท่านั้น หากมีข้อมูลจักรเกินกว่าที่จะประมวลผลข้อมูลเหล่านั้นอาจกลายเป็นประสิทธิภาพที่ลดลง (ORMs ใน PHP มักจะใช้ data-side script, เนื่องจากตัวสร้าง SQL chains ไม่สามารถสรุปได้ทุกอย่าง)

แต่ตามปกติทุกอย่างขึ้นอยู่กับแอปพลิเคชันและงานที่ทำอยู่


2
"Unstored กระบวนงาน" - คำที่เหมาะสมคือ "Parameterized SQL" คุณแค่เกาพื้นผิวของสิ่งที่ ORM ที่เป็นผู้ใหญ่สามารถทำเพื่อคุณได้ (การทำ batching, ขี้เกียจ ฯลฯ )
richeym

@richeym: ORM ส่วนใหญ่ใน PHP ไม่ได้ใช้คำสั่งที่เตรียมไว้ มันเป็น SQL ที่หนีออกมาและเรียงต่อกันได้ตลอดทาง แน่ใจว่าพวกเขามีข้อได้เปรียบในระดับที่สูงขึ้นกว่าแบบสอบถาม SQL ด้วยตนเองที่น่าเบื่อ อย่างไรก็ตามพวกเขานำเอาตรรกะการประมวลผลออกจากฐานข้อมูลอย่างเงียบ ๆ ดังนั้นจึงเป็น "ขั้นตอนที่ไม่จัดเก็บ"
มาริโอ

3

สิ่งหนึ่งที่ทำร้ายการใช้ ORMs คือแฟน ๆ ของพวกเขาจำนวนมากมักอ้างว่าเราไม่จำเป็นต้องรู้ทฤษฎี SQL และ RDB อีกต่อไป ผลลัพธ์ที่ได้นั้นแตกต่างกันไปจากเรื่องตลกไปจนถึงเรื่องหายนะอย่างสิ้นเชิง และนี่คือแม้จะเป็นล้านเท่าที่ ORM ผลิตและผู้เชี่ยวชาญกล่าวว่าเราต้องรู้จักทฤษฎี SQL และ RDB เป็นอย่างดีเพื่อใช้และกำหนดค่า ORM อย่างถูกต้อง

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


1

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

ขอบคุณ ORM ( Propelใน PHP) เราแบ่งตรรกะบางส่วนสำหรับโค้ดดังนั้นหนึ่งฟังก์ชันเพิ่มส่วน "is record valid valid" ของแบบสอบถามอีกส่วนความปลอดภัย ("แสดงบันทึกเหล่านี้เฉพาะในกรณีที่ผู้ใช้ มีความสามารถเหล่านี้ "), ... หากมีการเปลี่ยนแปลงโครงสร้างพื้นฐาน (เขตข้อมูลเพิ่มเติมที่ควรนำมาพิจารณาสำหรับ" ความถูกต้องของเร็กคอร์ด ") เราจะต้องเปลี่ยนหนึ่งฟังก์ชันไม่ใช่ยี่สิบประโยคของ SQL

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

หากการสืบค้นมีความซับซ้อนเกินกว่าที่จะแสดงด้วย Propel Criteria หรือเราต้องการคุณสมบัติเฉพาะของผู้จำหน่าย (ส่วนใหญ่การค้นหาข้อความแบบเต็มเนื่องจากเราใช้ MySQL) นี่ไม่ใช่ปัญหากับ Propel คุณสามารถเพิ่มเกณฑ์ที่กำหนดเองหรือเมื่อต้องการจริงๆเราใช้ raw SQL ( ตอนนี้ยิ่งง่ายต่อการรวมเข้ากับวัตถุ Propel จริง) คุณสามารถเพิ่มโปรแกรมเสริมเฉพาะผู้จำหน่ายของคุณไปยังคลาสที่สร้างขึ้นได้ดังนั้นคุณจึงมีทั้งสองที่ดีที่สุดในโลก: ไม่มี SQL ในรหัสแอปของคุณ แต่ด้วยความสามารถทั้งหมดของโปรแกรมฐานข้อมูลของคุณ


1

แต่ประเด็นก็คือคุณได้รับโปรแกรมจากฐานข้อมูลซึ่งหมายความว่าคุณไม่จำเป็นต้องคิดเหมือนอยู่ในฐานข้อมูล

ฉันทำงานใน C # ตอนนี้และใช้ LINQ เป็นจำนวนมากดังนั้นวิธีการที่คล่องแคล่วมากมาย ฉันไม่จำเป็นต้องคิดเกี่ยวกับวิธีการจัดเก็บหรือค้นหาวัตถุของฉันหรือบันทึกในระดับโปรแกรมและน้อยมากที่ระดับเลเยอร์ธุรกิจ

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

คุณยังสามารถเขียนฟังก์ชัน DB-side บ่อยครั้งที่คุณสามารถทำแผนที่ผ่าน

และเหนือสิ่งอื่นใดการแยกเช่นนั้นอนุญาตให้ทดสอบได้และบังคับให้คุณ (เล็กน้อย) เขียนโค้ดที่มีโครงสร้างดีกว่า


2
อีกครั้งทำไมคุณต้องโปรแกรมออกจากฐานข้อมูล? ทำไมไม่ทำให้ฐานข้อมูลเป็นส่วนหนึ่งของการพัฒนาของคุณตามที่คุณเลือกให้ใช้ตั้งแต่แรก หากคุณไม่ต้องการ RDBMS ทำไมต้องผลัก ORM ขึ้นมา
Jé Queue

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

@burnt_hand - "แต่ประเด็นคือคุณได้โปรแกรมออกจากฐานข้อมูลซึ่งหมายความว่าคุณไม่จำเป็นต้องคิดเหมือนอยู่ในฐานข้อมูล" อะไรคือข้อได้เปรียบสากล? ฉันเห็นว่ามันเป็นข้อดีเมื่อแอปของคุณมองหาวิธีที่จะคงอยู่ของวัตถุ แต่สำหรับข้อมูลเชิงสัมพันธ์ OLTP และอื่น ๆ การเขียนโปรแกรมจากฐานข้อมูลเป็นวิธีหนึ่งที่จะทำให้คุณมีเวลามากขึ้น
luis.espinal

@ luis.espinal - คุณคิดว่าตัวเองสำคัญขนาดไหน? ฉันอยากรู้จริงๆ คุณมีตัวอย่างหรือไม่
burnt_hand

@burnt_hand - จริง ๆ แล้วฉันมีตัวอย่างจริงหลายประการ รูปแบบล่าสุดส่วนใหญ่เกี่ยวข้องกับรูปแบบโดเมนที่มีขนาดใหญ่มากและเป็นเรื่องของประสิทธิภาพโครงการต้องอัปโหลดการแมปไฮเบอร์เนตทั้งหมดเมื่อเริ่มต้น โรงงานเซสชั่นที่เกิดขึ้นจะจบลงด้วยการกินหน่วยความจำที่ใช้ไปแล้ว 30% ... สำหรับการผูก ฐานรหัสมีความมุ่งมั่นเกินไปกับ ORM และมันเป็นไปไม่ได้ที่จะเขียนมันออกมาใหม่ ตอนนี้มีความหมายที่แท้จริงเนื่องจากแอปพลิเคชันใกล้ถึงขีด จำกัด ทางกายภาพของฮาร์ดแวร์ที่ควรรัน คนเกียจคร้าน
luis.espinal

1

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

ตัวอย่างเช่นในโครงการปัจจุบันที่ฉันกำลังดำเนินการเรากำลังใช้ Java Persistence API และ Hibernate ถึงกระนั้นก็ตามเราใช้คุณสมบัติเฉพาะของฐานข้อมูลหลายอย่างเช่นการค้นหาในตารางที่มี soundex

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

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


1

ฉันเขียนของตัวเองซึ่งช่วยให้ฉันเลือกและแทรกได้ง่ายขึ้น

สิ่งเฉพาะ Evey db พร้อมใช้งาน ฉันต้องเขียนแบบสอบถามด้วยตนเองซึ่งห้องสมุดช่วยเหลือฉันด้วย (ฉันสามารถใช้ '?' และ params แทนการตั้งชื่อพารามิเตอร์ด้วยตนเองและใช้. เพิ่ม)

ฉันเดาว่าครึ่งนึงของฉันมีประโยชน์จริงๆ ฉันได้รับความช่วยเหลือในโลกแห่งออมและทำส่วนสำคัญในโลกแห่งการสืบค้น


1

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

พวกเขากำลังมาตรฐานสากลทั้งที่ระบุหรือทั่วไป ยิ่งไปกว่านั้นมันยังเร็วและง่ายต่อการนำไปใช้ ฉันใช้ subsonic, linq-to-sql และ framework อนุญาตให้ผู้พัฒนามุ่งเน้นไปที่ตรรกะและกฎทางธุรกิจแทนการแมปฐานข้อมูล


1
มีเหตุผลมากมายในการใช้งานหรือไม่ใช้ ORM ORM ไม่ใช่ยาครอบจักรวาลและมีเพียงไม่กี่คนที่รู้วิธีใช้อย่างมีประสิทธิภาพ นอกจากนี้ในหลาย ๆ กรณีตรรกะทางธุรกิจได้ถูกสะท้อนอยู่แล้ว (บางส่วน) อย่างเป็นธรรมชาติในความสัมพันธ์ที่มีอยู่แล้วใน RDBMS (นี่เป็นสถานการณ์ที่พบบ่อยที่สุดที่ฉันเคยพบในอดีตและปัจจุบัน) RDBM ที่ได้รับการออกแบบมาอย่างดีมีการหนุนทางคณิตศาสตร์ที่แข็งแกร่งเข้าใจได้ดีพยายามและเป็นจริง ไม่ใช่ทุกอย่างที่ควรจะเป็นแบบจำลองด้วย RDMB แต่อย่างเท่าเทียมกันดังนั้น ORM ไม่ใช่วิธีแก้ปัญหาสากล
luis.espinal

1

สองเซ็นต์ของฉัน (ง่าย):

1: มี ORMS และมี ORMS ORMS บางตัวอยู่บนพื้นฐานของ Active Record และอื่น ๆ ที่อยู่บน Data Mapper นั่นก็คือการพิจารณาที่เกี่ยวข้อง แต่สิ่งหนึ่งที่ต้องมีการสอบสวนเพื่อทำความเข้าใจความหมาย โดยทั่วไป - ประสบการณ์ของฉันใน PHP คือ ORMS สนับสนุนอดีตไม่กี่สนับสนุนหลัง Active Record based ORMs ดูเหมือนจะมีหนึ่งในสองเอฟเฟกต์ - พวกมันอาจทำให้ฐานข้อมูลปกติหรือเรียกคลาสที่เหลือเฟือเพื่อสนับสนุนการโต้ตอบกับวัตถุ

2: ข้อดีของ ORMs ลดลงโดยสัมพันธ์โดยตรงกับความซับซ้อนของคิวรีที่คุณต้องการเรียกใช้ เมื่อคุณมีความสัมพันธ์ที่ดีง่ายๆ - เช่นผู้ใช้ -> โพสต์พวกเขาสามารถทำงานได้ดีมาก นี่คือเหตุผลที่ ORMs / framework ส่วนใหญ่ใช้ตัวอย่างเช่นนี้ เมื่อคุณต้องการเรียกใช้คิวรีที่ซับซ้อนอย่างไรก็ตามจำนวนของ ORMQL ที่คุณต้องการสร้างนั้นเทียบได้กับความยาวสตริงของเคียวรี SQL ปกติ - แต่มีประสิทธิภาพน้อยกว่าเนื่องจากกราฟวัตถุที่ใช้เคียวรีเรียกซึ่งชนิดของจุดที่เอาชนะ สิ่งที่เป็นนามธรรม สรุปสั้น ๆ ว่า ORM นั้นยอดเยี่ยมสำหรับงานฐานข้อมูลของคุณ 30-50% แรก แต่แย่มากในช่วงสุดท้าย ฉันคิดว่านี่เป็นอีกเหตุผลว่าทำไม AR จึงแพร่หลาย

3: ทำไมซ่อนจากฐานข้อมูล คุณจะใช้ภาษาฝั่งเซิร์ฟเวอร์เพื่อจาวาสคริปต์ที่เป็นนามธรรมหรือไม่?

ส่วนตัวฉันผสมผสานวิธีการเหล่านั้น:

  • ใช้ ORM สำหรับพื้นฐานโหลด "ผู้ใช้"
  • ใช้ DAO ที่มีแบบสอบถาม SQL ล่วงหน้าหลายรายการ (เช่น selectLike, selectWhere)
  • ขยาย DAO เมื่อจำเป็นเพื่อเพิ่มแบบสอบถามที่กำหนดเองที่เฉพาะเจาะจง แต่สามารถใช้งานได้อีกครั้ง
  • จัดเตรียมการเข้าถึงฐานข้อมูลอย่างง่ายผ่าน DAO - เช่น $ data = Dao-> แบบสอบถาม (สตริง sql ของคุณ) เพื่อดำเนินการค้นหาหนึ่งครั้ง

เมื่อกล่าวทั้งหมดนี้ Doctrine 2 จะออกมาเร็ว ๆ นี้ซึ่งดูน่าสนใจจริงๆ


0

คุณสามารถใช้เฟรมเวิร์กตัวแมป SQL เช่น myBatis ถ้าคุณต้องการใช้คุณสมบัติของ sql


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