NoSQL กับการตั้งค่า SQL Drupal อื่น ๆ


14

อะไรคือข้อดีของการใช้ NoSQL (เช่น MongoDB) เหนือ MySQL, PostGRE SQL หรือ MSSQL ใน Drupal? ข้อดีที่ได้รับจากการใช้หน่วยเก็บข้อมูลหรือการกำหนดค่าบางอย่างของ Drupal จำเป็นต้องเปลี่ยนหรือไม่?


นี่เป็นคำถามที่KárolyNégyesiจะให้คำตอบ "เผด็จการ" แน่นอนเขารู้ถึงประโยชน์ของการใช้ MongoDB กับ Drupal
kiamlaluno

อ่านใจของฉัน .. สนใจในตัวเลือกอื่น ๆ หากมีประโยชน์มากมายและแน่นอนว่าข้อดีมาพร้อมกับข้อเสีย
Kevin

คำตอบ:


13

MongoDB สามารถใช้เพื่อจัดเก็บเอนทิตีส่วนใหญ่หรือทั้งหมดของคุณลงในที่จัดเก็บข้อมูลที่รวดเร็วและเป็นเอกสาร การจัดเก็บประเภทนี้ปรับขนาดได้ดีกว่าหน่วยเก็บข้อมูลพื้นฐาน SQL ที่เรามีในแกน Drupal (ซึ่งยึดตาม schema "หนึ่งตารางต่อเขตข้อมูล")

ในสถานะปัจจุบันของ Drupal 7 คุณจะมี:

  • ตารางฐานของเอนทิตีที่เก็บอยู่ใน SQL (เช่น. ตารางผู้ใช้, ตารางโหนด, ฯลฯ )
  • ฟิลด์ทั้งหมดเก็บไว้ใน SQL
  • คุณสมบัติของเอนทิตีจากตารางพื้นฐานซ้ำซ้อนใน MongoDB

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

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

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

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


Damien Tournoud: หากคุณประสบปัญหาประสิทธิภาพการทำงานกับรายการเพียงไม่กี่พันรายการอาจมีปัญหาการซ้อนทับ (การกำหนดค่า DBMS แบบสอบถามที่เขียนไม่ดีอาจเป็นอะไรก็ได้) หากสคีมา SQL ที่ขีดเส้นใต้นั้นดีพอคุณไม่ควรกังวลก่อนหนึ่งล้านรายการในตารางเดียว (แต่เขตข้อมูลสามารถเติบโตได้อย่างรวดเร็วหากคุณพิจารณาถึงการแก้ไขและเขตข้อมูลที่มีหลายค่า)
Pierre

ประเด็นของฉัน: สคีมาของเราได้รับการทำให้เป็นมาตรฐานและเป็นผลให้ประสิทธิภาพการสืบค้นไม่ดีมาก เพื่อปรับปรุงประสิทธิภาพการสืบค้นคุณจะต้องทำให้ schema เป็นปกติ ข้อได้เปรียบหลักของการใช้ MongoDB ในกรณีของเราคือมันเป็น "เอ็นจิน den Denizationization อัตโนมัติ"
Damien Tournoud

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

@ เปียร์: ดาเมียนพูดคุยเกี่ยวกับหน่วยงานหนึ่งในสิบสองสามซึ่งสามารถแตกต่างอย่างสิ้นเชิงกว่าแถวของตาราง ตัวอย่างเช่นคุณสามารถมี 10 ฟิลด์หรือมากกว่าในเอนทิตีนั้นจากนั้นคุณมี 10 ตารางเพิ่มเติมที่ต้องสอบถามด้วยแบบสอบถามแยกต่างหากทุกครั้งที่โหลดเอนทิตีดังกล่าว และ MongoDB สามารถแทนที่ตารางเพิ่มเติมเหล่านี้ไม่ใช่ตารางฐานเอนทิตี
Berdir

2
ไม่มีโมดูลที่ควรคาดหวังว่าฟิลด์จะอยู่ใน MySQL วิธีเดียวในการสืบค้นเขตข้อมูลบน Drupal 7 คือ EntityFieldQuery เปิดบั๊กในโมดูลหากทำการสอบถามตารางฟิลด์โดยตรง ฉันไม่รู้จักโมดูลเหล่านี้ในเวลานี้
Damien Tournoud

7

MongoDB และที่คล้ายกันได้รับการออกแบบมาเพื่อเก็บข้อมูลที่มีโครงสร้าง (ลำดับชั้น) ในลักษณะที่ค่อนข้างยืดหยุ่น

ตัวอย่างเช่นDrupal 7เมื่อใช้field_sql_storageทุกฟิลด์จะได้รับเป็นตารางของตัวเอง เมื่อคุณแนบ 10 เขตข้อมูลกับชนิดเนื้อหาคุณจะสิ้นสุดด้วย 10 ตารางในฐานข้อมูลของคุณ เมื่อคุณโหลดโหนดนั้นfield_sql_storageจะดำเนินการค้นหาต่อฟิลด์และต่อโหนด (หรือหลายโหนดเมื่อใช้node_load_multiple)

เมื่อคุณใช้mongodb_field_storageคุณสามารถจัดเก็บเขตข้อมูลทั้งหมดของโหนดในเอกสารเดียวและรับด้วยแบบสอบถามเดียว

นอกจากนี้คุณยังสามารถจัดเก็บสิ่งอื่น ๆ เช่นจ้องจับผิดการประชุมแคชบล็อกในMongoDB

คุณยังต้องการ MySQL แต่MongoDBไม่ได้แทนที่ (เฉพาะบางส่วนเท่านั้น)

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


สวัสดี Berdir! คุณรู้หรือไม่ว่าฉันทิ้ง MongoDB ใน proyect ที่มีอยู่เพื่อทดสอบประสิทธิภาพฉันจะเปิดใช้งาน & ปิดใช้งานโมดูลโดยไม่มีผลกระทบหรือไม่ ฉันต้องการลอง mongo แต่ถ้ามันไม่ทำงานหรืออะไร ปลอดภัยไหมที่จะลอง? (ฉันรู้ว่าคุณไม่สามารถรับประกันได้ แต่ฉันสงสัยว่าเกิดอะไรขึ้นในกรณีส่วนใหญ่)
Beto Aveiga

1
สำหรับการเริ่มต้นคุณไม่สามารถวางลงในแต่ละฟิลด์ได้กำหนดค่าแบ็กเอนด์ที่เก็บข้อมูลที่ใช้คุณจะต้องเปลี่ยน / สร้างฟิลด์ของคุณใหม่สร้างมุมมองของคุณอีกครั้ง (เนื่องจากจำเป็นต้องใช้แบ็กเอนด์ efq_views ) อาจจะสอบถามของคุณเองถ้าคุณเขียนแบบสอบถามโดยตรงกับตารางข้อมูลเขต อาจจะง่ายกว่าในการสร้างโครงสร้างเดียวกันในการติดตั้งใหม่เพื่อการเปรียบเทียบเบื้องต้น
Berdir

ขอบคุณ Berdir! ฉันลองใช้ MongoDB เมื่อไม่กี่วันที่ผ่านมา แต่ไม่ได้รับประสิทธิภาพที่เห็นได้ชัดเจน แต่ฉันก็ไม่ได้ตระหนักถึงสิ่งต่าง ๆ / การเปลี่ยนแปลงที่คุณกำลังบอกฉันตอนนี้ ฉันคิดว่า "MongoDB ควรสร้างความแตกต่างในเว็บไซต์ขนาดใหญ่" ฉันจะลอง MongoDB อีกครั้ง
Beto Aveiga

5

ข้อดีมาพร้อมกับข้อเสีย

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

โมดูลจำนวนมากจะไม่สามารถทำงานร่วมกับ MongoDB ได้ดังนั้นคุณจะสูญเสียความสามารถในการทำงานร่วมกัน

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

ฉันคิดว่าฉันเคยตอบเรื่องนี้มาก่อนมีสิ่งซ้ำซ้อนเกือบทั้งหมดใน SO

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