מיפוי אובייקטי-רלציוני

מיפוי אובייקטי-רלציוני (באנגלית: ORM - object-relational mapping) היא טכניקת תכנות בשפות תכנות מונחות-עצמים, להמרת נתונים בין מערכות טיפוסים בלתי-תואמות: טיפוסים מורכבים (אובייקטים) בשפות תכנות מונחות-עצמים, וטבלאות בבסיסי נתונים יחסיים (רלציוניים). למעשה, השימוש בטכניקה זו יוצר "בסיס נתונים מונחה-עצמים וירטואלי" (virtual object database), הניתן לשימוש מתוך שפת התכנות. קיימות חבילות תוכנה מסחריות וגם חופשיות לביצוע מיפוי אובייקטי-רלציוני (ראו: Hibernate לדוגמה), אם כי יש מתכנתים הבוחרים ליצור כלי ORM משלהם.

סקירה

בתכנות מונחה-עצמים, משימות של ניהול נתונים (data management) בדרך כלל ממומשות על ידי מניפולציה של אובייקטים שהם כמעט תמיד ערכים לא-סקלריים. לדוגמה, נחשוב על רשומה בפנקס כתובות, המייצגת אדם אחד ביחד עם אפס או יותר מספרי טלפון ואפס או יותר כתובות. ניתן למדל רשומה כזאת במימוש מונחה-עצמים על ידי אובייקט "Person" עם משתני מחלקה שכל אחד מהם מחזיק נתונים המרכיבים את הרשומה: השם של האדם, רשימת מספרי טלפון, ורשימת כתובות. רשימת מספרי הטלפון עצמה תכיל אובייקטי "PhoneNumber", וכן הלאה. בשפת התכנות, מטפלים ברשומת פנקס הכתובות כאובייקט יחיד (לדוגמה, ניתן לקשר אליה על ידי משתנה יחיד המכיל מצביע אל האובייקט). ניתן לשייך לאובייקט מתודות (פונקציות) שונות, כגון מתודה המחזירה את מספר הטלפון המועדף, מתודה המחזירה את כתובת המגורים, וכו'.
לעומת זאת, בסיסי נתונים פופולריים רבים, כגון בסיסי נתונים המבוססים על שפת SQL, יכולים לשמור ולבצע פעולות רק על ערכים סקלריים פשוטים כדוגמת ערכים מספריים (integer, float, double) ומחרוזות, המאורגנים בטבלאות. על מנת לאחסן אובייקטים מורכבים (כמו רשומה בפנקס כתובות מהדוגמה למעלה) בבסיס נתונים, על המתכנת להמיר את האובייקטים לקבוצות של ערכים פשוטים יותר (וגם להמיר אותם חזרה לצורה של אובייקטים כאשר הוא מאחזר נתונים מבסיס הנתונים), או להשתמש רק בערכים סקלריים פשוטים במסגרת התוכנית. מיפוי אובייקטי-רלציוני משמש למימוש הגישה הראשונה.
עיקר האתגר הוא בתרגום הייצוג הלוגי של אובייקטים לצורות אטומיות הניתנות לאחסון בבסיס נתונים, תוך שימור התכונות (properties) של האובייקטים, והיחסים ביניהם, כך שבמועד מאוחר יותר ניתן יהיה לטעון אותם חזרה מבסיס הנתונים, וליצור אובייקטים. אם פונקציונליות זו של אחסון ואחזור ממומשת עבור אובייקטים, נאמר עליהם שהם persistent.

השוואה עם טכניקות מסורתיות לגישה לנתונים

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

בסיסי נתונים שאינם מבוססי SQL

פתרון נוסף הוא להשתמש במערכת לניהול בסיסי נתונים מונחי-עצמים (OODBMS) או בסיסי נתונים מונחי-מסמכים כדוגמת בסיסי נתונים מבוססי XML. בסיסי נתונים מסוג OODBMS הם בסיסי נתונים המתוכננים במיוחד לעבודה עם ערכים מונחי-עצמים. שימוש ב-OODBMS מבטל את הצורך בהמרת נתונים לצורת SQL ובחזרה, מכיוון שהנתונים נשמרים בצורתם המקורית כאובייקטים, והיחסים בין האובייקטים מיוצגים ישירות, ולא נדרש שימוש בטבלאות איחוד מיוחדות.
בסיסי נתונים מונחי-מסמכים גם הם מונעים את הצורך "לגרוס" אובייקטים לצורה של שורות בטבלאות. רבות מהמערכות מסוג זה תומכות גם בשפת השאילתות XQuery לאחזור נתונים.
בדרך כלל נוטים להשתמש בבסיסי נתונים מונחי-עצמים ביישומי "נישה" מורכבים. אחד הטיעונים כנגד השימוש ב-OODBMS הוא שהמעבר מבסיס נתונים מבוסס SQL לבסיס נתונים מונחה-עצמים טהור עלול לגרום לאיבוד היכולת ליצור שאילתות שאינן תלויות ביישום, לצורך אחזור קומבינציות של נתונים אד הוק, מבלי להגביל את מסלול הגישה. מסיבה זו, מתכנתים רבים "מרגישים בבית" יותר עם מערכות למיפוי אובייקטים ל-SQL, אף על פי שמרבית בסיסי הנתונים מונחי-העצמים כוללים גם יכולת מסוימת לעיבוד של שאילתות SQL.

מחלוקת

שימוש בטכנולוגיות למיפוי אובייקטי-רלציוני לעיתים מעורר מחלוקת. ישנם מגוון קשיים העולים כאשר מנסים להחליט כיצד להתאים מערכת אובייקטים לבסיס נתונים רלציוני. קשיים אלה מכונים באנגלית object-relational impedance mismatch.
אלטרנטיבה למימוש ORM היא שימוש בשפות פרוצדורליות טבעיות (native) המסופקות עם כל בסיס נתונים גדול בשוק. ניתן לקרוא לשפות אלה מצד הלקוח באמצעות שימוש בביטויי SQL.