พังพอน vs mongodb (โมดูล nodejs / ส่วนขยาย) อันไหนดีกว่ากัน? และทำไม?


109

ฉันเพิ่งมาถึง Node.js และเห็นว่ามี libs มากมายที่จะใช้กับ MongoDB ซึ่งสิ่งที่ได้รับความนิยมมากที่สุดคือสองสิ่งนี้: (พังพอนและพังพอน) ฉันสามารถหาข้อดีข้อเสียของส่วนขยายเหล่านั้นได้หรือไม่? มีทางเลือกอื่นที่ดีกว่าสำหรับสองคนนี้หรือไม่?

แก้ไข: พบไลบรารีใหม่ที่ดูเหมือนว่า node-mongolian ที่น่าสนใจและ "Mongolian DeadBeef เป็นไดรเวอร์ Mongo DB node.js ที่ยอดเยี่ยมซึ่งพยายามประมาณเปลือก mongodb อย่างใกล้ชิด" (readme.md)

https://github.com/marcello3d/node-mongolian

นี่เป็นเพียงการเพิ่มทรัพยากรให้กับผู้คนใหม่ ๆ ที่มองเห็นสิ่งนี้ดังนั้นโดยพื้นฐานแล้วชาวมองโกเลียจะเหมือน ODM ...


เหตุใดจึงต้องใช้เลเยอร์สคีมาสำหรับฐานข้อมูลที่มีสคีมาน้อย ถ้าคุณต้องการฐานข้อมูลที่ใช้สคีมาให้ใช้อย่างอื่นที่สร้างขึ้น (พังพอนเป็นเพียงรูปแบบนามธรรมของ mongodb)
Simon Dragsbæk

คำตอบ:


123

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

หากคุณต้องการคนขับเพราะคุณตั้งใจจะแหกกฎมากมายที่ ODM อาจบังคับใช้ให้ไปกับ MongoDB หากคุณต้องการไดรเวอร์ที่รวดเร็วและสามารถใช้งานได้กับคุณสมบัติที่ขาดหายไปลอง DeadBeef ของ Mongolian: https://github.com/marcello3d/node-mongolian


34

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

  • เอกสารที่ยาก / ไม่ดี
  • มีการใช้โมเดล และกำหนดโครงสร้างสำหรับเอกสารของคุณ สิ่งนี้ดูเหมือนจะแปลกสำหรับ Mongo ตรงที่ข้อดีอย่างหนึ่งคือคุณสามารถโยนคอลัมน์ (err, attribute?) หรือไม่ก็เพิ่มเข้าไปก็ได้
  • โมเดลคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ - ตัวฉันเองและนักพัฒนาอื่น ๆ ที่ฉันทำงานด้วยมีปัญหาที่กรณีของชื่อคอลเลกชันที่กำหนดแบบจำลองอาจทำให้ไม่บันทึกอะไรเลยโดยไม่มีข้อผิดพลาด เราพบว่าการใช้ชื่อตัวพิมพ์เล็กทั้งหมดทำงานได้ดีที่สุด เช่นแทนที่จะทำอะไรบางอย่างเหมือนmongooseInstace.model('MyCollection', { "_id": Number, "xyz": String })จะดีกว่า (แม้ว่าชื่อคอลเลกชันจะเป็นจริงก็ตามMyCollection):mongooseInstace.model('mycollection', { "_id": Number, "xyz": String })

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


11
เรื่องเอกสาร. ฉันไม่เห็นด้วยมากกว่านี้ เอกสารไม่ดีและทำให้เรื่องแย่ลงด้วยเช่นกันเอกสารไม่ถูกต้อง ฉันมักจะพบว่าตัวเองกำลังแคร็กเปิดโค้ด (ซึ่งไม่ใช่เรื่องเลวร้ายเช่นนี้) แต่เนื่องจากปัญหาด้านเอกสาร
JP Richardson

1
ชื่อคอลเลคชัน AFAIK มีความละเอียดอ่อนใน Mongo ไม่ใช่ Mongoose
Nick Campbell

34
เผื่อว่าใครสงสัยตอนนี้เอกสารค่อนข้างดี
Kevin Beal

7
ฉันไม่เห็นด้วยเอกสารยังคงล่าช้า
Steve K

5
ยังเห็นด้วยว่าเอกสารยังขาดอยู่
Brendan Weinstein

25

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

  1. พังพอนจะช้าลง (สำหรับแอพใหญ่)
  2. พังพอนยากกว่าด้วยคำค้นหาที่ซับซ้อนกว่า
  3. จะมีสถานการณ์เมื่อคุณต้องการความเร็วมากขึ้นและคุณจะเลือกไปโดยไม่มีพังพอนจากนั้นคุณจะมีคำค้นหาครึ่งหนึ่งที่มีพังพอนและครึ่งหนึ่งไม่มี นั่นเป็นสถานการณ์ที่บ้าคลั่งมีครั้งเดียว ..
  4. Mongoose จะทำให้คุณเขียนโค้ดได้เร็วขึ้นด้วยแอพง่ายๆที่มีโครงสร้างฐานข้อมูลแบบธรรมดา
  5. พังพอนจะทำให้คุณอ่านเอกสาร mongodb และ mongoose docs
  6. ด้วยพังพอนสแต็คของคุณจะได้รับอีกสิ่งหนึ่งที่ต้องพึ่งพาและเป็นอีกหนึ่งความเป็นไปได้ที่จะพังและเผาเป็นขี้เถ้า

ไดรเวอร์ mongodb เป็นไดรเวอร์ดิบคุณสื่อสารโดยตรงกับ mongodb พังพอนเป็นชั้นนามธรรม คุณได้รับ I / O เป็น db ได้ง่ายขึ้นในขณะที่โครงสร้างฐานข้อมูลของคุณนั้นเรียบง่ายเพียงพอ

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

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

ฉันมาจากโลก PHP ที่นั่นเรามี Raw sql พร้อมฟังก์ชัน mysql_ ที่คิดค่าเสื่อมราคาแล้วเราได้ PDO ซึ่งเป็นเลเยอร์นามธรรมเชิงวัตถุเพื่อสื่อสารกับ sql หรือคุณสามารถเลือก ORM ที่มีน้ำหนักมากเช่น Doctrine เพื่อให้มีสิ่งที่คล้ายกับพังพอนใน mongoDB วัตถุที่มีวิธี setter / getters / save และอื่น ๆ ไม่เป็นไร แต่การเพิ่มนามธรรมมากขึ้นคุณกำลังเพิ่มไฟล์มากขึ้นตรรกะมากขึ้นเอกสารเพิ่มเติมการอ้างอิงมากขึ้น ฉันชอบทำให้สิ่งต่างๆเรียบง่ายและมีการพึ่งพาน้อยลงในสแต็กของฉัน BTW นั่นคือเหตุผลที่ฉันย้ายจาก PHP ไปยัง Javascript ไคลเอนต์เซิร์ฟเวอร์ตั้งแต่แรก ..

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


3
ฉันยังคิดว่า mongodb ดีกว่าพังพอนเพราะมันรวดเร็วและเป็นไปได้ในการสืบค้นที่ซับซ้อน จะดีกว่าสำหรับแอพขนาดใหญ่และคุณควรใช้ไดรเวอร์ mongodb แบบดิบ ฉันเห็นด้วยอย่างยิ่งกับคุณ
Abdul Alim Shakir

ฉันเห็นด้วยอย่างยิ่งกับคุณแม้ว่าคุณจะไม่ได้ทำแอปขนาดใหญ่ก็ตาม คำค้นหาที่ซับซ้อนนั้นง่ายกว่ามากในโปรแกรมควบคุม Mongo เมื่อเทียบกับการทำในพังพอน
Juan

14

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

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

เพื่อให้เป็นตัวอย่างทั้งหมดโดยการสุ่ม:

  • ดิบ {Boolean, default: false} ดำเนินการโดยใช้บัฟเฟอร์ดิบ bson

"ดำเนินการโดยใช้บัฟเฟอร์ bson ดิบ" คืออะไร? ฉันไม่พบคำอธิบายใด ๆ และการค้นหาโดย Google สำหรับวลีนั้นไม่ได้ช่วยอะไร บางทีฉันอาจจะใช้ Google ต่อไปได้ แต่ไม่ควรต้องทำ ข้อมูลควรจะมี มีประสิทธิภาพความเสถียรความสมบูรณ์ความเข้ากันได้การพกพาหรือข้อได้เปรียบด้านฟังก์ชันสำหรับการเปิด / ปิดตัวเลือกนี้หรือไม่? ฉันไม่รู้จริงๆหากไม่ต้องดำน้ำลึกลงไปในโค้ดและถ้าคุณอยู่ในเรือของฉันนั่นเป็นปัญหาร้ายแรง ฉันมี daemon ที่ไม่จำเป็นต้องมีการคงอยู่ที่สมบูรณ์แบบ แต่โปรแกรมต้องมีความเสถียรมากในขณะรันไทม์ ฉันสามารถสันนิษฐานได้ว่านั่นหมายความว่าฉันคาดหวังว่าจะต้อง deserialize และทำให้เป็นอนุกรมเป็น JSON หรือเป็นสิ่งที่อยู่ในระดับต่ำภายในและโปร่งใสสำหรับผู้ใช้ แต่ฉันอาจผิด แม้ว่าฉันมักจะตั้งสมมติฐานที่ดี แต่ฉันไม่สามารถพึ่งพาสมมติฐานและการคาดเดาเมื่อสร้างระบบที่สำคัญได้ ที่นี่ฉันสามารถทดสอบการยืนยันด้วยโค้ดหรือเจาะลึกลงไปใน Google หรือโค้ดของพวกเขา ในฐานะที่เป็นสิ่งหนึ่งที่ไม่ได้เลวร้าย แต่ฉันพบว่าตัวเองอยู่ในสถานการณ์เช่นนี้หลายครั้งเมื่ออ่านเอกสารของพวกเขา ความแตกต่างอาจหมายถึงวันที่ใช้ไปกับงานเทียบกับชั่วโมง ฉันต้องการการยืนยันและเอกสารแทบจะไม่ให้คำอธิบายเลยนับประสาอะไรกับการยืนยัน

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


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