הצטרפו לקבוצות שלנו לקבלת עדכונים מרוכזים פעם בשבוע:

ווטסאפ:
http://wa.dwh.co.il
טלגרם:
http://telegram.dwh.co.il

אורדינליות של נתונים, מאת: תמיר בר-נצר

 

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

 

בהרצת שאילתות אנחנו משתמשים לרוב באופרטורים המעידים על יחס של גדלים בין ביטויים. לצורך עניין זה ישנם שלושה סוגים של אופרטורים: greater than, less than,between.

 

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

 

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

 

בהקשר זה, ישנם 3 סוגי נתונים בבסיס הנתונים: מספרי, תאריכי וטקסט.

 

בואו נסקור כל אחד מהסוגים הללו:

 

                                        מספרי

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

 

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

 

לדוגמא:

המספר 145 יאוחסן כך:

ordinality1.gif

 

 

 

 

 

 

 

 

 

 

 

 

 

 

לעומת זאת, המספר 370, יאוחסן כך:

 

 

 ordinality2.gif

 

 

 

 

 

 

 

משום ש     1x255+115=370

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

ordinality3.gif

 

 

 

 

370 יבוטא כאמר כ:

 ordinality2.gif

 

 

 

 

 

לפי הכלל שהוסבר ממוקדם, הDB משווה את הbyte הראשון, ומסיק ש370 גדול מ145 משום ש1 גדול מ0.
מסקנה: כאשר הנתונים מאוחסנים כמספר, האורדינליות נשמרת.


                                              תאריכים


למרות שתאריכים מוצגים על המסך לרוב כ dd/mm/yyyy, הם תמיד מאוחסנים כמחשב כמספר לכן הסעיף הקודם העוסק במספרים תקף גם כאן וזה גם מחזיר אותנו לכלל הטוען שלא משנה כיצד הנתון מוצג אלא כיצד הנתון מאוחסן במערכת.
מסקנה: כאשר הנתונים מאוחסנים כתאריך, האורדינליות נשמרת.


                                            נתונים טקסטואלים (מחרוזות)


נתונים טקסטואלים מאוחסנים כרצף של בתים, כאשר כל בית מכיל מספר המיצג את האות הרלוונטית. הקוד הממיר כל מספר לתו נקרא גם קוד Ascii, ובצורתו המורחבת נקרא קוד Unicode.
דוגמא של טבלת Ascii, ניתן לראות בעל ידי הקשה
כאן.
לדוגמא:
כדי לאחסן את המילה DAD, הDB ישתמש ב3 בתים, בית אחד לכל אות:

 

ordinality4.gif 

 

 

 

 

 

או ביצוג המספרי לפי טבלת הAscii:

ordinality5.gif

 

 

 

 

 

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

 

כאשר מוגדר שדה טקסטואלי מוגדרים גם מספר התווים ששדה זה יוכל להכיל ,והישור של הערכים בתוך הבתים הוא לצד שמאל. לדוגמא, אם נגדיר שדה טקסט בגודל 3 תווים, מה יהיה יותר "גדול" מבחינת הDB המילה DAD או האות T, בואו ננתח:

 

המילה DAD תיוצג כרצף של 3 תווים, כלומר:

ordinality4.gif

 

 

 

 

 

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

ordinality6.gif

 

 

 

 

 

 

מכיוון שסדר הסריקה על ידי הDB הוא מצד שמאל , ומשום שערך הAsciiשל T הוא גדול מזה של D, אזי האות T תהיה גדולה מהמילה DAD.

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

 

מסקנה: יש להזהר, כאשר מדובר במחרוזות טקסטואליות

 next1.gif  back1.gif