ทำไมการใช้ MySQL สำหรับเว็บไซต์พจนานุกรมจึงเป็นความคิดที่ไม่ดี


55

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

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

ที่ฝั่งไคลเอ็นต์แอปพลิเคชันจะต้องสามารถให้ช่องค้นหาด้วยการเติมข้อความอัตโนมัติซึ่งใช้ REST API ที่แบ็กเอนด์จัดหาให้ ปลอดภัยที่จะไปกับ MySQL ในสถานการณ์เช่นนี้หรือไม่? หรือฉันควรใช้ MongoDB หรือ ElasticSearch ของการแก้ปัญหาอื่น ๆ สำหรับเรื่องนี้? ควรมีการจัดเก็บและเข้าถึงบันทึกหลายแสนรายการด้วยวิธีนี้


79
ผู้คนที่บอกคุณว่ายังไม่ได้ทำการวิจัยเรื่องนี้ ภาษาที่มีคำศัพท์ที่ใหญ่ที่สุดคืออังกฤษมีน้อยกว่าหนึ่งล้านคำที่ต่างกัน สิ่งนี้อยู่ในขอบเขตของความสามารถด้านประสิทธิภาพของ DB เชิงสัมพันธ์
TheCatWhisperer

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

46
เกี่ยวกับ "MongoDB นั้นดีกว่ามากสำหรับประสิทธิภาพ" - เป็นคำสั่งที่ไม่มีการแก้ไขโดยไม่มีการชี้แจงขอบเขตนี่เป็นเรื่องไร้สาระอันดับ ตัวอย่างเช่นดูที่เครื่องมือบรรทัดคำสั่ง 235x เร็วกว่าคลัสเตอร์ Hadoop ของคุณ (ซึ่งฉันเจอจากลิงค์ในวิกฤตเว็บไซต์โรคอ้วน )
Wildcard

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

13
@Brandon สิ่งที่น่าเศร้าก็คือการอ้างว่า "NoSQL นั้นเร็วกว่ามาก" มักจะอธิบายเหตุผลทางทฤษฎีว่าทำไมพวกเขาถึงควรจะดีกว่านี้มาก แต่ในทางปฏิบัติที่ไม่ได้ใช้กับสถานการณ์ในโลกแห่งความเป็นจริง ดูเช่นที่นี่ ชุดมาตรฐานที่ใช้ของพวกเขาคือโอเพนซอร์สและมีอยู่ใน GitHub เช่นกัน Hell CERN จัดการ PB ของข้อมูลด้วย OracleDB ได้ดี
Voo

คำตอบ:


95

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

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

    คุณจะไม่ทำการค้นหาคีย์หลัก คุณจะทำการค้นหาคำหลัก

  2. คำที่สามารถที่เกี่ยวข้องทั้งในความหมายหรือการสะกดคำ ( อ่านอ่าน , สีแดงและกก )

    เมื่อใดก็ตามที่คุณเห็นคำว่า "ที่เกี่ยวข้อง" คิดว่า "ฐานข้อมูลเชิงสัมพันธ์"

  3. หากคุณต้องการความเร็วคุณต้องแคชที่ด้านบนของฐานข้อมูลเชิงสัมพันธ์ไม่ใช่โมเดลข้อมูลเชิงสัมพันธ์ที่ใช้งานไม่ได้

  4. ฐานข้อมูลที่ได้รับการปรับมาตรฐานอย่างถูกต้องจะเร่งความเร็วการค้นหาคีย์หลักและการค้นหาเนื่องจากมีบิตน้อยกว่าในการกรอง

  5. ผู้ที่กล่าวว่าฐานข้อมูลที่ได้มาตรฐานนั้นช้ากว่านั้นอ้างถึง 0.1% ของคดีที่เป็นจริง ในอื่น ๆ 99.9% ของกรณีที่พวกเขาไม่ได้จริงทำงานร่วมกับฐานข้อมูลปกติอย่างแท้จริงเพื่อดูประสิทธิภาพมือแรกจึงไม่สนใจพวกเขา ฉันทำงานกับฐานข้อมูลปกติ รักมัน ไม่อยากกลับไป และฉันไม่ใช่คนฐานข้อมูล ฉันเป็นผู้ชาย C # / JavaScript / HTML / Ruby

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

  7. พจนานุกรมยังกำหนดชนิดของคำว่ามันเป็น (คำนามคำกริยาคำคุณศัพท์ ect) นี่ไม่ใช่แค่ข้อความ: "คำนาม" มันมีความหมายเช่นกัน นอกจากนี้ยังมีฐานข้อมูลเชิงสัมพันธ์ที่คุณสามารถพูดสิ่งต่าง ๆ เช่น "ให้ฉันทุกคำนามสำหรับภาษาอังกฤษ" และเนื่องจากฐานข้อมูลปกติจะใช้คีย์ต่างประเทศและคีย์ต่างประเทศมีดัชนี (หรือควรมี) การค้นหาจะเป็นสแน็ปอิน

  8. คิดว่าคำศัพท์ออกเสียงอย่างไร ในภาษาอังกฤษโดยเฉพาะคำจำนวนมากมีการออกเสียงเหมือนกัน (ดูตัวอย่างของฉันด้านบนด้วยการอ่านและการอ่าน

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

  9. และตอนนี้เรามาพูดเกี่ยวกับคำพหูพจน์และเอกพจน์ :) คิดว่า "เรือ" และ "เรือ" หรือความจริงที่ว่าคำว่า "เอกพจน์" หรือ "พหูพจน์"

  10. Oh! และตอนนี้เรามาพูดเกี่ยวกับอดีตกาลกาลปัจจุบันกาลอนาคตและนามปัจจุบัน (พูดตามตรงฉันไม่รู้หรอกว่าอืม "คำนามในปัจจุบัน" คืออะไรฉันคิดว่ามันเกี่ยวข้องกับคำที่ลงท้ายด้วย "ing" ใน ภาษาอังกฤษหรือบางสิ่ง)

    ค้นหา "วิ่ง" และคุณจะเห็นกาลอื่น ๆ : วิ่งวิ่งวิ่ง

    ในความเป็นจริง "เครียด" เป็นอีกความสัมพันธ์หนึ่ง

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

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

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


7
สำหรับ # 1 การจัดทำดัชนีมักจะเป็นจุดแข็งของข้อเสนอที่ไม่ใช่เชิงสัมพันธ์ไม่ใช่จุดอ่อน
JimmyJames

61
@JimmyJames อย่าคิดว่านาทีที่ระบบเชิงสัมพันธ์ไม่ได้ใช้ดัชนีชนิดเดียวกัน เทคนิคเหล่านั้นเป็นหัวหอกในโลกนั้น
Blrfl

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

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

4
ฉัน downvoted คำตอบนี้เพียงแค่ "เมื่อใดก็ตามที่คุณเห็นคำว่า 'เกี่ยวข้อง' คิดว่า 'ฐานข้อมูลเชิงสัมพันธ์' นั่นเป็นเรื่องน่าขัน ฉันรักฐานข้อมูลเชิงสัมพันธ์ แต่โมเดลเชิงสัมพันธ์ไม่เหมาะสมกับความสัมพันธ์ทุกประเภท มุมมองของคุณของข้อมูลปกติก็ผิดอย่างสมบูรณ์ การทำให้ข้อมูลเป็นปกติจะปรับการแก้ไขให้เหมาะสมเนื่องจากข้อมูลไม่ได้ซ้ำกันไม่ใช่การค้นหา (นั่นเป็นสาเหตุที่การรายงาน DBs ไม่เป็นมาตรฐานพวกเขาใช้เทคนิคการสร้างแบบจำลองมิติและแบบแผนของดาว) ฉันไม่คิดว่าคุณรู้ว่าคุณกำลังพูดถึงเรื่องอะไร 80 upvotes ยืนยันข้อกังวลใจทั้งหมดของฉันเกี่ยวกับคำแนะนำในเว็บไซต์นี้
jpmc26

27

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

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

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

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

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

เมื่อคุณมีผู้ใช้หลายล้านคนคุณจะต้องออกแบบโครงสร้างใหม่อีกครั้งแม้ว่าคุณจะเลือกคีย์ - ค่าเริ่มต้นแล้วก็ตาม


13
บทส่งท้ายในบทความนี้อธิบายถึงสถานการณ์ของการเปลี่ยนแปลงข้อกำหนดที่ทำให้การออกแบบเป็นโมฆะ มันอธิบายแอปพลิเคชั่นหนึ่ง (ของจริง) ว่าเป็น "กรณีการใช้งานที่สมบูรณ์แบบสำหรับ MongoDB" แต่จากนั้นจะอธิบายถึงวิธีการเปลี่ยนแปลงข้อกำหนดเล็กน้อยที่จะต้องนำมาใช้ใน RDBMS ซึ่งจำเป็นต้องใช้งานในปริมาณที่เหมาะสม สำหรับกรณีการใช้งาน (ตามที่อธิบายไว้ในส่วนก่อนหน้าของบทความ) นั้นไม่ใช่กรณีการใช้งานที่ดีของ Mongo
Derek Elkins

5
บทความ MongoDB ของซาร่าห์เป็นสิ่งที่เราทำด้วยผลิตภัณฑ์ 1.0 ที่เราสร้างขึ้นโดยใช้มัน โดย 1.1 เราใช้ Postgres
Joe

@ DerekElkins อ้างอิงซุปเปอร์ขอบคุณ!
Erik Eidt

1
"แต่จากนั้นอธิบายว่าการเปลี่ยนแปลงเล็กน้อยในข้อกำหนดนั้นจะเป็นเรื่องเล็กน้อยที่จะนำไปใช้ใน RDBMS" แน่นอน แต่สิ่งที่ตรงกันข้ามคือความจริง เราใช้ RDBMS ในที่ทำงานและปัญหาใบหน้าที่อาจแก้ไขได้ใน MongoDB ความต้องการซอฟต์แวร์นั้นไม่ได้แม็พอย่างสมบูรณ์แบบกับความสามารถของเครื่องมือที่เราใช้
NPSF3000

@ NPSF3000 มันจะยอดเยี่ยมถ้าคุณสามารถอ้างอิงการอ้างอิงเช่นบล็อกหรือข้อความบางส่วนที่อธิบายไว้ในนั้น!
Erik Eidt

10

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

การพิจารณาอื่น ๆ คือการจำลองแบบและความยืดหยุ่น ฐานข้อมูลเชิงสัมพันธ์มีแนวโน้มที่จะได้รับการออกแบบรอบ ๆ อินสแตนซ์เดียว คุณควรอ่านทฤษฎีบท CAPและพิจารณาสิ่งที่สำคัญที่สุดสำหรับคุณ


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

2
@Ben Resiliency เป็นเป้าหมายในสิทธิ์ของตนเอง หากมีจุดความล้มเหลวเพียงจุดเดียวไม่เป็นที่ยอมรับสำหรับแอปพลิเคชันโซลูชันแบบกระจายจะนำเสนอโซลูชัน โซลูชันที่ไม่ใช่ RDBMS มีแนวโน้มที่จะมุ่งเน้นไปที่สิ่งนี้มากขึ้น ไม่ใช่เรื่องที่ต้องพิจารณา ความล่าช้าและความพร้อมใช้งานเป็นสิ่งที่กังวล หากความต้องการของคุณคือมี uptime 99.9% คุณสามารถหยุดทำงานได้ประมาณ 9 ชั่วโมงต่อปีและการสูญเสียข้อมูลในหนึ่งฐานข้อมูลนั้นเป็นความหายนะดังนั้นคุณจำเป็นต้องพิจารณาการจำลองแบบ / สำรองข้อมูล / สแน็ปช็อต มันเข้าใจผิดคิดว่ามันจำเป็นต้องทำให้สิ่งต่าง ๆ ง่าย
JimmyJames

2

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

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

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

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