ישנן דרכים רבות שבהם נוכל לעצב את הסכמה של מסד נתונים רלציוני.
נרצה דרך לתאר מסד נתונים שכזה ואת מבנה המידע שלו באופן שיוכל להיות מתורגם לטבלאות ויחסים בינהם.
נרצה גם את היכולת לדעת מתי ניתן לשפר טבלה, מתי יש בה מידע מיותר ואיך נוכל להשמיט אותו בלי לפגוע במבנה המידע.
התאורייה שנתמקד עליה נקראת dependencies, מונח מוכר ונפוץ מאוד בתחום מדעי המחשב גם בהקשר של SOLID ותכנות מונחה עצמים. התאורייה שנדבר עליה כאן תוכל לתת לנו כלים להבין ולנתח יותר טוב עיצוב של מסד נתונים ולקבוע את נכונותה.
Functional Dependencies
אילוץ פונקציונלי על יחס (תזכורת, יחס הוא אוסף של מידע שמסודר באופן כלשהו, במסד נתונים רלציוני זה יהיה בטבלה, כמו כן היחס בנוי באמצעות סכמה)
הוא הצהרה מהצורה-
אם שתי tuples של מסכימים על כל הערכים (tuple=רשומה בטבלה), כלומר לשתי רשומות יש בידיוק את הערכים האלו לפי הסדר של הסכמה, אזי הם חייבים להסכים על הערכים ״.
במילים אחרות אם לשתי records בטבלה יש את אותם ערכים בסדר מסויים בסכמה אז ישנה מוסכמה שיהיו להם ערכים מסויים זהים.
בנוסח פורמלי
ונאמר גם ש
נגיד ש מספק אם לכל מופע של יחס אותו יהיה נכון לכל מופע שכזה. נשים לב שזה בעצם הפעלה של איזשהו אילוץ על הטבלה.
כמו כן נשים לב שה FD הבא
שקול לקבוצת ה FD הבאים
נביט בדוגמה הבאה:
הסכמה היא Movies1(title,year,lenght,genre, studioName, starName) .
נשים לב שכל שהטבלה הזאת ״עושה יותר מדי״ היא מחזיקה מידע שיכול להיות שייך לשלוש טבלאות אחרות Movies, Studio , StarsIn .
בהמשך נראה יותר למה הסכמה הנ״ל לא טובה בכלל. אבל כדי להבין למה הסכמה הזאת לא טובה ומה שגוי בעיצוב שלה, עלינו לקבוע מהי התלות הפונקציונלית שמחזיקה את המידע. נוכל לטעון שהתלות הפונקציונלית הבאה תקינה
כלומר באופן לא פורמלי, התלות אומרת שאם לשתי מופעים יש את אותה שנה ואותה כותרת, יש להם גם את אותו אורך של סרט, ז׳אנר ושם סטודיו.
נשים לב אבל ש
אינו FD תקין שכן ניתן לראות של star wars יש מספר שחקנים וזה הגיוני.
זה נובע מכך שFD קובע אילוץ על כל הטבלה ולא על מופע בודד והעובדה שאנחנו יכולים להחזיק בטבלה מופע עם מספר שחקנים עבור סרט, שוללת את האפשרות שזאת אכן תלות פונקציונלת תקינה.
מה ״פונקציונלי״ בתלות פונקציונלית?
הסיבה שזה נקרא תלות פונקציונלית היא בגלל שבגלל שההמרה הזאת של סדרת ערכים לסדרה אחרת היא בעצם פונקצייה. עם זאת, זוהי אינה פונקצייה טריוויאלית שאנחנו מכירים מהמתמטיקה אלא יותר מהמתמטיקה של תורת הקבוצות כלומר אין איזשהם חישובים שמבצעים על הקלט כדי לקבל פלט, פשוט קלט של ערכים מסויימים מהטבלה מחזיר קבוצה של ערכים אחרים.
מפתחות
נאמר שקבוצה של ערך או מספר ערכים הוא מפתח ליחס אם
הערכים האלה קובעים באמצעות FD את כל הערכים הערכים של היחס. כלומר, כל שתי מופעים שונים של היחס לא מחליטים באופן מלא על הערכים האלו.
לא קיימת תת קבוצה של קבוצת הערכים הנ״ל שקובעת את כל שאר הערכים של . כלומר מפתח הוא הקבוצה המינימלית ביותר שמכריעה על שאר הערכים.
כאשר מפתח מחזיר ערך יחיד נסמן את המפתח כולו כ ולא כ .
בהקשר לטבלה למעלה נוכל להגיד ש יהווה מפתח עבור הטבלה Movie1 .לא בעייה להוכיח את זה שכן כבר אמרנו ש כותרת ושנה קובעים את כל הפרמטרים האחרים חוץ משם השחקן. לאחר שהוספנו אותו ברור שיש הכרעה על כל שאר הערכים של הטבלה.
סופר-מפתחות
בפשטות, סופר מפתח הוא קבוצה של ערכים שמכילה בתוכה מפתח. אם כן כל מפתח הוא גם סופר מפתח.
סופר מפתח תמיד מקיים את התנאי הראשון של מפתח אבל לא את המינימליות שלו.
חוקים של תלות פונקציונלית
נדבר על חוקים של תלות פונקציונלית שיעזרו לנו לנתח איזה עוד תלויות יש לטבלה בהינתן תלות קיימת.
טרנזיטיביות:
וגם
אז
splitting rule:
כפי שרשמנו למעל
שקול ל:
טירוויאליות:
ישנו מצב ביניים שבו חלק אבל לא כל התכונות בצד ימין הם גם בצד שמאל. התלות הזאת אינה טריווויאלית אבל ניתן לפשט אותה על ידי הסרה מצד ימין את כל התכונות שמופיעול בצד שמאל כמו בתמונה למטה. בפשטות נוכל להגיד ש שקול ל כאשר זה כל ה שלא נמצאים גם ב .
השאווה בין תלויות:
נאמר ששתי קבוצות של , שקולות אם כל המופעים של הטבלה שמספקים את שקולות לכל המופעים של הטבלה שמספקים את .
באופן כללי יותר נאמר ש קבוצה של נסמנה עוקבת אחרי אם כל מופע של טבלה שמספק את יספק גם את .
טרמינולוגיה :
מופע של טבלה או relation instance מייצגת מעין snapshot של הטבלה בנקודת זמן מסויימת.
tuple הוא ערך כלשהו בטבלה כלומר record או שורה בטבלה.
computing the closure of attributes
נניח ש הוא קבוצה שלתכונות ו היא קבוצה של תלויות פונקציונליות .
נגדיר את ה closure של תחת כקבוצה התכונות כך שכל טבלה שמספקת את גם מספקת את
כלומר התלות הנ״ל עוקבת אחרי .
נסמן את הסגור של תחת כ
נשים לב שיתקיים תמיד
מתכונת הטריוויאליות.
חישוב של closure:
בהנתן ו נרצה לחשב את
אם נחוץ, פצל את כל האיברים ב כך שכל יהיה רק עם ערך אחד מימין.
נגדיר את להיות
הוסף ל את כל כאשר יתקיים שב נמצא . כך שמתקיים
החזר את כאשר לא ניתן לבצע עוד את 3.
התמונה מסבירה את הליך החישוב, בהתחלה אנחנו מוסיפים את כל הפרמטרים עצמם מהכלל הטירוויאלי, לאחר מכן מוסיפים את צד ימין של מיד לאחר שהוספנו את צד שמאל שלו ולאחר מכן שוב מרחיבים את החיפוש. בעצם זה מעין סגור טרנזיטיבי של קבוצת התכונות הזאת.
נתבונן על דוגמה:
נניח שיש טבלה עם התכונות ונניח שיש לה את ה FD הבאים
נרצה לחשב את הסגור של
אם כן אנחנו יודעים ש כבר שייכים לסגור,
כעת נרצה לקחת את
ולפצל אותו ל
כעת .
באיטרציה הבאה נשים לב ש שייך לקבוצת ה FD שהגדנו ולכן ייכנס ל .
לאחר מכן נראה ש מתקיימים אז באיטרצייה הבאה נכניס את ולאחר מכן נכניס את וזהו.
אם כן הגענו למסקנה ש
בפסודו זה ייראה כך
closure(X={A1,A2,...,An},F)
while (exists rule B1,B2,...,Bm in F such that:
{B1,B2,...Bm} subset of X AND C not in X) :
add C to X
return X
ההוכחה של זה לא מסובכת אך יכולה להיות ארוכה, צריך להוכיח ש
א) האלגוריתם לא מוסיף תכונות שלא מתאימות כלומר שאכן הוא יחס נכון מהתכונות שלמדנו והוא מסופק על ידי טבלה שמספקת את כל מי שב הוכחה באינדוקצייה על מספר הפעמים שהגדלנו את . כלומר לאחר כל צעד אם ניקח יתקיים ש הוא אכן תקין.
בסיס- כאשר לא עשינו אף צעד, במצב זה עבור יתקיים ש הוא אחד מהתכונות ומהתכונה הטריוויאלית מתקיים הדרוש. צעד- נניח שהוספנו את לאחר שמצאנו אם כן אנחנו יודעים מהנחת האינדוקצייה ש
מסופק על ידי . ולכן אוטומטי נובע מתכונת הטרנזיטיביות הדרוש.
ב) צריך להוכיח שהאלגוריתם לא נכשל בלבנות סגור שעוקב אחרי .
נניח ש הוא תלות פונקציונלית שהאלגוריתם קבע שהיא אינה עוקבת אחרי .
כלומר לא שייך לסגור של התכונות תחת . נרצה להראות שאכן התלות הנ״ל באמת לא עוקבת אחרי . כלומר נרצה להראות שיש לפחות מופע אחד של הטבלה שמספק את אבל לא מספק את .
נגדיר את המופע הזה כ ומאוד קל לבנות אותו.
יש לו רק שתי tuples והם יסיכמו על כל התכונות שבסגור ולא יסכימו על כל מי שלא בסגור.
מכאן קל להוכיח שהמופע הזה עוקב אחרי מאיך שהאלגוריתם בנוי אבל לא עוקב אחרי שכן אינו בסגור.
closures and keys
נשים לב ש יהווה את קבוצת כל התכונות של טבלה אם ורק אם הוא סופר מפתח.
אם כן יש לנו אלגוריתם די פשוט לקביעה האם אוסף של תכונות הוא מפתח:
א) בהינתן חשב את הסגור שלו.
ב) אם הסגור הוא כל התכונות המשך לסעיף ג , אחרת תחזיר false.
ג) הורד כל פעם תכונה מ , הפעל את אלגוריתם למציאת סגור ובדוק האם עדיין כל התכונות נשארו, במידה ועבור אחד מהם לא נשארו כל התכונות, החזר false. אם זה מפתח מיד לאחר הורדת התכונה הראשונה אנחנו אמורים לקבל שהסגור לא מכיל את כל תכונות הטבלה.
Closing Sets of Functional Dependencies
לפעמים יש לנו בחירה של תלות פונקציונלית כלשהי שנרצה שתייצג קבוצה של תלויות כאלה עבור טבלה כלשהי.
אם נקבל קבוצה של תלויות אזי כל קבוצה אחרת של תלויות ששקולה ל תקרא בסיס של .
כדי להמנע מכמות גבוהה מאוד של בסיסים אופציונליים, נרצה להגביל את עצמנו לשקול רק בסיסים שיש להם איבר בודד בכל ה FD שלהם.
כמובן שבהינתן בסיס נוכל על ידי חוק הפיצול להפוך אותו לסינגלטוני ימני (תלות עם איבר יחיד בצד ימין).
אם כן, נגדיר בסיס מינימלי עבור טבלה הוא בסיס עם התנאים הבאים
א) כלל התלויות הפונקציונליות ב הם עם איבר יחיד בצד ימין.
ב) אם מורידים איבר כלשהו מ התוצאה כבר לא בסיס
ג) אם עבור איבר כלשהו ב , נסיר את אחד מהתכונות בצד שמאל שלו, התוצאה כבר לא תהווה בסיס.
מסקנה מידית היא ש אין FD טריוויאלי בבסיס מינימלי.
לדוגמה, ניקח את הטבלה כך שכל תכונה מספקת את השתיים האחרות כלומר ,
היא כמובן כוללת בתוכה גם את
ואת הטריוויאלים.
בסיס מינימלי לדוגמה במקרה הזה יהיה
זה בסיס כיוון שמחוקי הטרנזיטיביות נוכל לקבל את כל הנ״ל כלומר היא שקולה לקבוצת ה FD של R. וגם אם נוריד איבר אחד מהקבוצה זה כבר לא יהיה בסיס כי לא נוכל להסיק מטרנזיטיביות את השקילות. כמו כן סעיף 3 לא רלוונטי כי יש רק איבר אחד בכל צד.
Armstrong’s axioms
אומנם למדנו על חישוב של סגור של תכונות גם כדי לבדוק האם FD אחד עוקב אחרי קבוצה כלשהי של FD אחרים, אבל ישנם מספר כללי אצבע שנקראים אקסיומות ארמסטרונג שיכולים לעזור לנו לקבוע האם FD עוקב אחרי קבוצה מסויימת.
רפלקסיביות
אוגמנטציה
ואם יש כפילויות בין או עם פשוט נשמיט אותם.
טרנזיטיביות
וגם
אז
Projecting Functional Dependencies
באלגברה רלציונית הקרנהם היא פעולה על יחס מסויים שבפעולה זו משמיטה מספר מסויים של עמודות והיא מסומנת כ .
אם כן, נרצה שעבור יחס עם קבוצה של FD שתסומן כ , כאשר נעשה ״הקרנה״ על כלומר נחשב כאשר היא קבוצת התכונות שנשארות לאחר ההקרנה. נרצה לדעת איזה מה נשארו ב .
את התשובה ניתן להשיג על ידי חישוב ההקרנה של תלות פונקציונלית שזאת קבוצת כל התלויות ש
עוקבות אחר
מכילות רק תכונות מ
מאחר ויכולות להיות הרבה תלויות כאלו וברבים מהם גם יתכנו כפילויות, נרצה להקל ולהקטין את הקבוצה הזאת לנוחיותנו.
באופן כללי החישוב הוא אקספוננציאלי למספר התכונות ב והאלגוריתם ייראה כך:
קלט: טבלה וטבלה נוספת שמוקרנת מ וגם קבוצה של תלויות פונקציונליות ש מספק פלט: קבוצת כל התלויות שמוחזקות ב
א) הגדר קבוצה ריקה
ב) עבור כל תת קבוצה של תכונות , חשב את ביחס ל . פעולה זאת עלולה לכלול תכונות מ שאינן ב ולכן, נוסיף ל את כל התלויות הלא טריוויאליות כאשר נמצאת גם ב וגם היא תכונה של .
ג) כעת, הוא בסיס לכל התלויות שמוחזקות ב אך הוא לא בהכרח מינימלי. נחשב את הבסיס המינימלי באופן הבא
1) אם קיים FD נסמנו כך שהוא עוקב אחרי אחד התלויות האחרות ב , הסר אותו מ
2) יהי תלות ב עם לפחות שתי תכונות ב ויהי להיות עם תכונה אחת שהורדנו. אם עוקב אחרי כל התלויות ב כולל אז הסר את והחלף ב .
3) חזור על כל השלבים הנ״ל בכל הצירופים האפשריים.
נפעיל את האלגוריתם על דוגמה פשוטה להמחשה,
נניח ש עם התלויות . נניח שנרצה להקרין החוצה את התכונה , כלומר להשאיר את הטבלה . עקרונית, כדי למצוא את התלויות של , נרצה לקחת את הסגור של כל תתי הקבוצות של , ביחס לקבוצת כל התלויות של . במקרה הזה יש כמה דרכים פשוטות לחישוב שנוכל לעשות
אנחנו יודעים שהקבוצה הריקה וקבוצת כל התכונות לא יכולות להכיל אינן טריוויאלית.
אם אנחנו יודעים כבר שהסגור של קבוצה כלשהי היא כל התכונות, אז אנחנו לא יכולים למצוא תלויות חדשות על ידי supersets של .
אם כן, נתחיל מכל הסגורים הסינגלטונים ולאחר מכן נעבור לכל הסגורים הכפולים אם יש צורך בכך.
תחילה
ומכאן ש מחזיקים ב .
באופן דומה ו .
נשים לב שבגלל שהסגור של מכיל כבר את כל התכונות, אין מה לחשוב על קבוצה שמכילה את . אם כן נובע מכך הסגור הכפול היחיד שצריך לקחת בחשבון הוא
סך הכל גילינו שב מתקיים ש ונוכל לצמצם את מטרנזיטיביות ולקבל בסיס מינימלי