SQL לעומת NoSQL: מה ההבדלים ובמה לבחור

Logos of SQL and MongoDB side by side.

מבוא לעולם ה-Databases

מסד נתונים או Database, הוא אוסף מאורגן של מידע שניתן לבצע עליו מניפולציות כמו עריכה, הוספה, מחיקה, קריאה ועוד. המניפולציה הזו נעשית בעזרת Query Language, כלומר, שאילתה.

ישנם שני סוגים עיקריים של Databases:

  • Relational Databases: בהם משתמשים ב-SQL (Structured Query Language) כשפת השאילתה הרשמית.
  • Non-Relational Databases או NoSQL: בהם משתמשים במגוון של שפות ופורמטים לביצוע שאילתות. ב-MongoDB משתמשים ב-MQL (MongoDB Query Language).

מבחינה היסטורית, מסדי הנתונים SQL עבדו טוב כאשר הנתונים היו סטטיים ופשוטים. ככל שהטכנולוגיה התקדמה, מסדי הנתונים מבוסס SQL היה פחות מצויד להתמודד עם מבני נתונים שמשתנים במהירות ובמורכבות. מסדי נתונים של NoSQL הפכו למפורסמים בכך שהם הציעו אלטרנטיבה גמישה יותר, שתוכל להתמודד עם מבני נתונים שמשתנים במהירות ובמורכבות.

סכמה (Schema)

בעולמות ה-Databases, סכמה היא המבנה שבו הנתונים מאוחסנים.

  • Relational Databases: הגדרת הסכמה מראש במסדי נתונים SQL אומרת שצריך לתכנן ולהגדיר מראש את מבנה הנתונים - (הנקרא גם טבלה). כלומר צריך להגדיר מראש אילו שדות יהיו בכל טבלה. לדוגמא, מסד נתונים לניהול משתמשים, אנחנו נגדיר טבלה שנקראת `users` עם שדות כמו `id`, `username`, `email`, `password`. כל נתון שנכנס למסד נתונים חייב להיות תואם לסכמה, ואם תנסו להכניס נתונים שאינם תואמים, כנראה תקבלו שגיאה.
  • Non-Relational Databases או NoSQL: במסדי נתונים NoSQL כמו MongoDB, אנחנו משתמשים בסכמה דינמית, כלומר אנחנו לא חייבים להגדיר סכמה מראש, ואנחנו יכולים להגדיר שדות שונות בכל פעם. לדוגמא, מסד נתונים לניהול משתמשים, אנחנו נשתמש בשדות כמו `id`, `username`, `email`, `password`. אבל הפעם אם תנסו להכניס עוד שדות כמו `address`, אתם תוכלו! וזו לא תהיה טעות! כי זו סכמה דינמית, וזו הגמישות ש-NoSQL יכולה לתת לנו.

מבנה נתונים (Data Structure)

מבנה נתונים הן הצורה שבהם הנתונים מסודרים ב-Database. למבנה הנתונים יש חשיבות גבוהה לכמה מהר וקל נוכל לבצע מניפולציות כמו קריאה, עריכה ומחיקה של הנתונים או כל שאילתה אחרת.

מבנה הנתונים ב-SQL

במסדי נתונים מבוססי SQL, המידע מאוחסן בטבלאות, שבהם יש שורות (Rows) ועמודות (Columns).

  • שורה (Rows)

    במסדי נתונים מבוססי SQL, השורה מייצגת רשומה (Record) אחת בטבלה. לכל שורה יש ערך בעבור כל אחת מהעמודות (columns) בטבלה.

  • עמודות (Columns)

    במסדי נתונים מבוססי SQL, העמודה מגדירה את הסוג של המידע (כמו INTEGER, TEXT, DATE וכו') שאמור להיות מאוחסן בה, ובכך אנחנו מבטחים את המידע שמאוחסן אצלנו.

Database table excerpt with customer names.

מבנה הנתונים ב-(MongoDB) NoSQL

ב-MongoDB, שהוא סוג של מסד נתונים NoSQL, הנתונים מאוחסנים בפורמט BSON, שהוא גרסה בינארית של JSON. המבנים ב-BSON דומים לאובייקטים ב-JavaScript.

  • Collection

    במסדי הנתונים של NoSQL, כמו MongoDB, ה-collection הוא האנלוגיה לטבלה במסדי הנתונים של SQL. ה-collection מכיל אוספים של מסמכים (documents).

  • Documents

    במסדי הנתונים של NoSQL, כמו MongoDB, ה-document מכיל את המידע בצורת JSON (מאוד דומה לאובייקט JavaScript), ויכול להכיל מידע שונה מ-document אחד ל-document אחר באותו ה-collection.

  • Fields

    השדות הם האנלוגיה לעמודות (columns) במסדי הנתונים של SQL. הם מייצגים את את הסוג של המידע (כמו String, Number, Boolean וכו') שאמור להיות מאוחסן ב-document.

MongoDB document structure with customer data.

ההרחבה/שינויים (Scaling)

בעולמות ה-database, ההרחבה/שינויים (Scaling) מתייחסת ליכולת של מסד הנתונים להתמודד עם עומס גבוה של נתונים או שאילתות, ולשפר ולחזק את יכולות התגובה והאחסון.

מסדי נתונים מסוג SQL

במסדי נתונים מסוג SQL, הנטייה היא לבצע הרחבה אנכית (Vertical Scaling) לשיפור הביצועים. זה כולל בדרך כלל שיפורים ברמת החומרה, כמו הוספת מעבד, זיכרון RAM וכדומה. אך יש לשים לב שההרחבה יכולה להיות יקרה ומוגבלת על ידי הספק של החומרה.

מסדי נתונים מסוג NoSQL

במסדי נתונים מסוג NoSQL, ניתן לבצע הרחבה אופקית (Horizontal Scaling) לשיפור הביצועים. במקום להתמקד בשיפור החומרה של שרת אחד, המידע מופץ בין מספר שרתים. זה מאפשר למעשה להשתמש במספר שרתים יחסית קטנים ופחות יקרים, כל אחד מהם מאחסן חלק ספציפי של הנתונים, ובכך לשפר את הביצועים מבלי ליצור כפילות.