ข้อดีของการใช้ฐานข้อมูลแบบไม่มีสคีมาเช่น MongoDB เมื่อเทียบกับฐานข้อมูลเชิงสัมพันธ์คืออะไร?


95

ฉันคุ้นเคยกับการใช้ฐานข้อมูลเชิงสัมพันธ์เช่น MySQL หรือ PostgreSQL และรวมกับเฟรมเวิร์ก MVC เช่น Symfony, RoR หรือ Django และฉันคิดว่ามันใช้งานได้ดี

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

ฐานข้อมูลแบบโอเพ่นซอร์สที่ปรับขนาดได้ประสิทธิภาพสูงไม่ต้องใช้สคีมา

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

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

หากคุณมีคำแนะนำในการจัดทำเอกสารและ / หรือตัวอย่างก็จะช่วยได้มากเช่นกัน

คำตอบ:


57

นี่คือข้อดีบางประการของ MongoDB สำหรับการสร้างเว็บแอปพลิเคชัน:

  1. แบบจำลองข้อมูลตามเอกสาร หน่วยจัดเก็บข้อมูลพื้นฐานนั้นคล้ายคลึงกับ JSON พจนานุกรม Python แฮช Ruby เป็นต้นซึ่งเป็นโครงสร้างข้อมูลที่สมบูรณ์ซึ่งสามารถเก็บอาร์เรย์และเอกสารอื่น ๆ ได้ ซึ่งหมายความว่าคุณสามารถแสดงโครงสร้างในเอนทิตีเดียวในโครงสร้างที่ต้องใช้หลายตารางเพื่อแสดงอย่างถูกต้องในฐานข้อมูลเชิงสัมพันธ์ สิ่งนี้มีประโยชน์อย่างยิ่งหากข้อมูลของคุณไม่เปลี่ยนรูป
  2. ความสามารถในการสืบค้นลึก MongoDB รองรับการสืบค้นแบบไดนามิกบนเอกสารโดยใช้ภาษาคิวรีแบบเอกสารที่มีประสิทธิภาพเกือบเท่ากับ SQL
  3. ไม่มีการโยกย้ายสคีมา เนื่องจาก MongoDB ไม่มีสคีมาโค้ดของคุณจึงกำหนดสคีมาของคุณ
  4. เส้นทางที่ชัดเจนในการปรับขนาดในแนวนอน

คุณจะต้องอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้และเล่นกับมันเพื่อให้ได้แนวคิดที่ดีขึ้น นี่คือการสาธิตออนไลน์:

http://try.mongodb.org/


3
ฉันยอมรับคำตอบนี้ แต่ลองดูคำตอบที่ดีอื่น ๆ ด้านล่าง @marcgg ตอบด้วยลิงค์ที่น่าสนใจเช่น
Guillaume Flandre

การพูดว่า "ประสิทธิภาพที่ดีขึ้น" ทำให้เข้าใจผิด ขึ้นอยู่กับว่าคุณกำลังทำอะไรอยู่ MongoDB ที่ไม่รองรับการรวมไม่ได้ทำให้เร็วขึ้น แต่หมายความว่ามันดีกว่าในการดำเนินการ DB อย่างง่าย (ตามจริงแล้วฉันไม่เห็นเกณฑ์มาตรฐานเพื่อพิสูจน์สิ่งนี้) เมื่อคุณต้องการฟังก์ชั่นที่เข้าร่วมแล้วประสิทธิภาพของคุณกับ Mongo จะลดลง แต่ถ้าคุณไม่ต้องการการรวมหรือคุณสมบัติเชิงสัมพันธ์เลยแน่นอนว่า Mongo อาจมีประสิทธิภาพ / ปรับขนาดได้มากกว่า
Sasha Chedygov

ขอบคุณ @SashaChedygov ฉันเห็นด้วยกับคุณ. นั่นค่อนข้างเลอะเทอะสำหรับฉันในปี 2010 :)
Kyle Banker

@KyleBanker: ไม่ต้องกังวลแค่แสดงความคิดเห็นเผื่อว่ามีคนเห็นในปี 2013 และเข้าใจผิด :) +1 สำหรับการแก้ไข
Sasha Chedygov

Mongo นำเสนอเส้นทางการปรับขนาดแนวนอนที่เฉพาะเจาะจงมากซึ่งมีประโยชน์ในสถานการณ์เฉพาะ ....
AK_

23

มีข้อดีมากมาย

ตัวอย่างเช่นสคีมาฐานข้อมูลของคุณจะปรับขนาดได้มากขึ้นคุณไม่ต้องกังวลเกี่ยวกับการโยกย้ายโค้ดจะน่าเขียนขึ้น ... ตัวอย่างเช่นนี่คือหนึ่งในรหัสโมเดลของฉัน:

class Setting
  include MongoMapper::Document

  key :news_search, String, :required => true
  key :is_availaible_for_iphone, :required => true, :default => false

  belongs_to :movie
end

การเพิ่มคีย์ก็แค่เพิ่มโค้ด!

นอกจากนี้ยังมีข้อดีอื่น ๆ ที่จะปรากฏในระยะยาวเช่นความสามารถในการขยายตัวและความเร็วที่ดีขึ้น

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

หากต้องการอ่านข้อมูลเพิ่มเติมฉันขอแนะนำให้ดูที่ " ทำไมฉันคิดว่า Mongo คือฐานข้อมูลที่ Rails เป็น Frameworks " หรือโพสต์นี้บนเว็บไซต์ mongodb เพื่อความตื่นเต้นและถ้าคุณพูดภาษาฝรั่งเศสได้โปรดอ่านบทความนี้เพื่ออธิบายวิธีตั้งค่า MongoDB ตั้งแต่เริ่มต้น

แก้ไข: ฉันเกือบลืมบอกคุณเกี่ยวกับrailscast นี้โดยไรอัน มันน่าสนใจมากและทำให้คุณอยากเริ่มทันที!


รางรถไฟนี้ดูน่าสนใจจริงๆ ไปดูกันเลยหวังว่าฉันจะเข้าใจวิธีการทำงานนี้ดีขึ้น
Guillaume Flandre

5

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

นอกจากนี้ยังหมายความว่าสิ่งที่คุณทิ้งลงไปจะยังคงไร้ความหมายโดยสิ้นเชิงหลังจากที่คุณทำเช่นนั้น

บางคนจะติดป้ายว่าเป็นข้อเสียเปรียบบางคนไม่ยอม

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

หากไม่มีสคีมาที่ได้รับการยอมรับอย่างดีไม่มีเพรดิเคตแบบขยายและไม่มีพรีซิเคตแบบขยายไม่มีทางที่ผู้ใช้จะสร้างความหมายใด ๆ จากสิ่งที่ถูกยัดไว้ในนั้น


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

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

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

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

1
... Schema-free บังคับให้ผู้ใช้เล่นเกมทายใจ และแม้ว่าผู้ใช้เหล่านั้นจะสามารถจัดการให้ถูกต้องได้ 90 หรือ 99% ของเวลา แต่ก็ยังคงเป็นเพียงเกมทายใจ
Erwin Smout

3

MongoDB ให้ความสำคัญกับ FLOSS Weekly ในสัปดาห์นี้ - http://twit.tv/floss105 ฐานข้อมูลที่ใช้แนวคิดคล้ายกันคือ CouchDB ซึ่งนำเสนอใน FLOSS Weekly อื่น: http://twit.tv/floss36

ฉันคิดว่ามันคุ้มค่าที่จะฟังสิ่งเหล่านี้นอกเหนือจากลิงก์ที่ @marcgg ให้ไว้


3

ประสบการณ์ของฉันกับ Postgres และ Mongo หลังจากทำงานกับทั้งฐานข้อมูลในโครงการของฉัน

Postgres (RDBMS)

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

ข้อดีที่สุดของการอยู่กับ Postgres คือเรามีสิ่งที่ดีที่สุดจากทั้งสองโลก เราสามารถจัดเก็บข้อมูลลงใน JSONB โดยมีข้อ จำกัด ความสอดคล้องและความเร็ว ในทางกลับกันเราสามารถใช้คุณสมบัติ SQL ทั้งหมดสำหรับข้อมูลประเภทอื่น ๆ เอ็นจิ้นพื้นฐานมีความเสถียรมากและทำงานได้ดีกับปริมาณข้อมูลที่หลากหลาย นอกจากนี้ยังทำงานบนฮาร์ดแวร์และระบบปฏิบัติการที่คุณเลือก Postgres ให้ความสามารถ NoSQL พร้อมกับการรองรับธุรกรรมเต็มรูปแบบการจัดเก็บเอกสาร JSON โดยมีข้อ จำกัด เกี่ยวกับข้อมูลฟิลด์

ข้อ จำกัด ทั่วไปสำหรับ Postgres

การปรับขนาด Postgres ในแนวนอนนั้นยากกว่ามาก แต่ทำได้

การดำเนินการอ่านอย่างรวดเร็วไม่สามารถทำได้อย่างสมบูรณ์กับ Postgres

ไม่มีฐานข้อมูล SQL

Mongo DB (เสือมีสาย)

MongoDB อาจเอาชนะ Postgres ในมิติของ "สเกลแนวนอน" การจัดเก็บ JSON เป็นสิ่งที่ Mongo ได้รับการปรับให้เหมาะสม Mongo จัดเก็บข้อมูลในรูปแบบไบนารีที่เรียกว่า BSONb ซึ่ง (โดยประมาณ) เป็นเพียงการแทนค่าไบนารีของส่วนเหนือของ JSON MongoDB จัดเก็บวัตถุตรงตามที่ออกแบบไว้ จากข้อมูลของ MongoDB สำหรับแอปพลิเคชันที่เน้นการเขียน Mongo กล่าวว่าเอ็นจิ้นใหม่ (Wired Tiger) ช่วยให้ผู้ใช้มีประสิทธิภาพในการเขียนเพิ่มขึ้นถึง 10 เท่า (ฉันควรลองสิ่งนี้) โดยลดการใช้พื้นที่จัดเก็บลง 80 เปอร์เซ็นต์ช่วยลดต้นทุนในการจัดเก็บ บรรลุการใช้ประโยชน์จากฮาร์ดแวร์มากขึ้น

ข้อ จำกัด ทั่วไปของ MongoDb

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

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


2

ทุกอย่างเกี่ยวกับการแลกเปลี่ยน MongoDB เร็ว แต่ไม่ใช่ ACID ไม่มีธุรกรรม มันดีกว่า MySQL ในบางกรณีการใช้งานและแย่กว่าในบางกรณี


โปรดตรวจสอบความคิดเห็นนี้ทันที MongoDb 4.0 รองรับธุรกรรมกรดแล้ว
Anant Simran Singh

1

สายร้องที่เขียนใน MongoDB: The Definitive Guide

มีเหตุผลที่ดีหลายประการ:

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

0

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


1
คำตอบของคุณมีแนวคิดผิด ๆ สองสามข้อ แม้ว่า MongoDB จะไม่เสี่ยงต่อการแทรก SQL แต่ก็มีความอ่อนไหวต่อการฉีดโดยทั่วไปมากกว่า คุณสามารถระบุ Javascript ตามอำเภอใจใน $ where clause ของแบบสอบถาม นอกจากนี้ไม่เหมือนกับตัวเลือก NoSQL อื่น ๆ MongoDB สามารถทำแบบสอบถามที่ซับซ้อนได้
Emily

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

ดูเหมือนว่าพวกเขาจะบอกว่า MongoDB ไม่เหมาะสำหรับการสืบค้นเชิงสัมพันธ์ที่ซับซ้อน แต่สำหรับคำค้นหาที่ไม่เกี่ยวข้องเชิงสัมพันธ์ที่ซับซ้อนมันค่อนข้างเหมาะสม ดูที่mongodb.org/display/DOCS/Advanced+Queriesสำหรับสิ่งดีๆที่คุณสามารถทำได้
Emily

0
  1. MongoDB รองรับการค้นหาตามฟิลด์การค้นหานิพจน์ทั่วไปรวมถึงฟังก์ชันสคริปต์ java ที่ผู้ใช้กำหนด
  2. MongoDB สามารถใช้เป็นระบบไฟล์โดยใช้ประโยชน์จากการจัดสรรภาระงานและคุณสมบัติการจำลองข้อมูลบนเครื่องหลายเครื่องเพื่อจัดเก็บไฟล์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.