מודל נתונים: MongoDB לעומת SQL

סער טויטו

סער טויטו

Software & Web Development


TL;DR
  • מודל נתונים קובע איך מאחסנים מידע ב-Database — בצורה נכונה משפר גמישות ומהירות שאילתות.
  • יחיד-ליחיד (One-to-One) MongoDB משתמש ב-Embedded Document, SQL משתמש ב-Normalization וטבלאות נפרדות.
  • יחיד-לרבים ורבים-לרבים MongoDB משתמש ב-Referenced Documents, SQL משתמש ב-Join Table לקישור בין טבלאות.
  • הבחירה בין הגישות תלויה בצורך העסקי — לא בטכנולוגיה. מסתכלים על דוגמאות מהחיים האמתיים.

ההבדלים בין מודל נתונים ב-MongoDB לעומת SQL

מודל נתונים הוא האופן בו מסדרים ומאחסנים מידע ב-Database. MongoDB שומר נתונים כמסמכים JSON גמישים — ב-Embedded Document ליחיד-ליחיד, וב-Referenced Documents ליחסים מורכבים. SQL מפצל נתונים לטבלאות נפרדות (Normalization) ומשתמש ב-Join Table לרבים-לרבים. הבחירה בין הגישות לא תלויה בטכנולוגיה אלא בצורך העסקי האמתי.

מודל נתונים יכול להתחלק לשלושה חלקים:

  • יחיד-ליחיד One-to-One:

    זהו מבנה אופטימלי כאשר ישנם נתונים שקשורים לישות מסוימת, כמו אדם. למשל, ההיסטוריה הרפואית של מטופל. פרטי ההיסטוריה הרפואית שלי שונים ממטופלים אחרים (תרופות, תורים, ניתוחים וכו'); במילים אחרות, ההיסטוריה הרפואית שלי קשורה אליי באופן פרטני, ולכן גם השמירה שלהם במסד הנתונים תהיה ביחד.

    ב-MongoDB, השיטה שבה מאחסנים מידע בצורה הזו נקראת Embedded Document. אך במסדי נתונים מבוססי SQL, אנחנו מפצלים את הנתונים לטבלאות שונות וזה נקרא Normalization.

  • יחיד-לרבים One-to-Many:

    זהו מבנה אופטימלי כאשר ישנם נתונים שקשורים לישות מסוימת, כמו אדם. למשל, לאדם אחד יכולים להיות מספר כרטיסי אשראי, וכרטיסי אשראי רבים יכולים להיות שייכים לאדם אחד. אך האם כרטיס אחד יכול להיות משויך למספר אנשים?

    התשובה תלויה בצורך העסקי שלכם. כלומר, אם כל כרטיס שייך לאדם אחד בלבד, מדובר ביחס יחיד-ליחיד, ואז נשתמש ב-Embedded Document ב-MongoDB או ב-Normalization במסדי נתונים של SQL.

    אבל אם כרטיס אשראי אחד יכול להיות משויך למספר אנשים, מדובר ביחס של יחיד-לרבים, ואז נשתמש ב-Referenced Documents ב-MongoDB או בטבלת מקשרת (Join Table) ב-SQL.

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

  • רבים-לרבים Many-to-Many:

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

    במקרים הללו, כאשר מדובר ביחסים של רבים-אל-רבים, נשתמש ב-Referenced Documents ב-MongoDB או בטבלת מקשרת (Join Table) ב-SQL. ולמה זה לא יחיד ליחיד לדוגמה? כי המוצר לא שייך ספציפית לאדם מסוים, אלא להרבה בני אדם.

שאלות נפוצות על מודל נתונים ב-MongoDB ו-SQL

מה זה מודל נתונים ולמה הוא חשוב?

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

מה ההבדל בין Embedded Document ל-Referenced Documents ב-MongoDB?

Embedded Document שומר את כל הנתונים הקשורים בתוך אותו מסמך — מתאים ליחסי יחיד-ליחיד כשהנתונים שייכים לישות אחת בלבד. Referenced Documents שומרים את הנתונים במסמכים נפרדים ומקשרים ביניהם באמצעות ID — מתאים ליחסים מורכבים של יחיד-לרבים ורבים-לרבים.

מה ההבדל בין Normalization ב-SQL ל-Embedded Document ב-MongoDB?

Normalization ב-SQL מפצל נתונים לטבלאות נפרדות כדי להימנע מכפילויות — כל ישות יושבת בטבלה משלה ומקושרת לאחרות באמצעות foreign keys. Embedded Document ב-MongoDB שומר את כל הנתונים הקשורים יחד באותו מסמך JSON. Normalization מבטיח עקביות נתונים, Embedded מאפשר קריאה מהירה יותר.

מתי להשתמש ב-Join Table ב-SQL?

Join Table מתאים ליחסים של רבים-לרבים. לדוגמה, כשלקוח אחד יכול לרכוש מספר מוצרים, ומוצר אחד יכול להיות מבוקש על ידי מספר לקוחות. היא טבלה נפרדת שמכילה רק את ה-IDs של שתי הטבלאות המקושרות ומאפשרת לבצע JOIN queries לשליפת הנתונים הדרושים.

איך לבחור בין MongoDB ל-SQL לפרויקט חדש?

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