לחלץ להפוך ולטעון

בהמשך לפוסט הקודם החלק הראשון בבנית ה EPG הוא למצוא את המידע ולטעון אותו לתוך מסד הנתונים , אחרי שמצאתי באינטרנט קובץ XML שמכיל רשימת ערוצים ותכניות התחלתי לחשוב איך אני מכניס אותם לרייבן :)

הנסיונות שלי להכניס את המידע למסד הנתונים לימדו אותי שלושה דברים

  • ניהול מידע במסד נתונים מבוסס מסמכים
  • בניית אינדקסים
  • עבודה עם סטים

ניהול מידע

לוח משדרים מורכב מהמאפיינים הבאים

  • Channels
  • Programs
  • Tags or Categories

במסד נתונים רלציוני הייתי מכין שלוש טבלאות והייתי שם מפתחות (forigen keys) במקומות המתאימים בכדי לקשר את הטבלאות, אך לא כך הדבר ברייבן.

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

אין שכפול מידע וישנו שדה שמציין את המזהה את הערוץ

אוביקט התוכנית מכיל עותק של אוביקט הערוץ

בניית אינדקסים

בניית אינדקס הוא תהליך חד פעמי ובשלב זה אפשר לחשוב עליו כמו על יצירת VIEW במסד נתונים. בניית אינדקס כרוכה ברישום 2 פונקציות מיפוי וצמצום (Map-Reduce) כאשר הרעיון מאחורי שיטה זו הוא חלוקת הבניה של האינדקס לשתי פונקציות נפרדות אחת שמגדירה איך המידע ניראה ובעצם ממפה את המודל (מכאן Map) ואחת שאחראית על סינון התוצאות או צמצומם (מכאן Reduce) .

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

עבודה עם סטים

למעט עריכה וצפייה (פעולות CRUD) על מסמך בודד עבודה על סטים (מספר מסמכים) נעשית דרך האינדקסים ניתן להשתמש בAPI לקבלת אינדקס מלא או לצמצם את התוצאות החוזרות ,שלא כמו עבודה על מסמך בודד חלק מהעבודה על סטים (מחיקה לפי אינדקס לדוגמא) לא ניתן לבצע דרך הסשן אלא דרך אוביקט DocumentStore

ואחרי הכל הנה המחלקה שטוענת את הנתונים לתוך רייבן (את הפרויקט המלא ניתן להוריד מכאן).

This entry was posted in מאמרים, קוד and tagged , , , . Bookmark the permalink.

כתיבת תגובה

האימייל שלך לא יוצג באתר. (*) שדות חובה מסומנים

*

תגי HTML מותרים: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">