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

מיפוי אובייקטי-רלציוני (באנגלית: 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.

== ראו גם ==
* מסד נתונים יחסי
* Persistence
* Hibernate

קטגוריה:תכנות
קטגוריה:מסדי נתונים