Design Theory for Relational Databases

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

Functional Dependencies

אילוץ פונקציונלי FD על יחס R (תזכורת, יחס הוא אוסף של מידע שמסודר באופן כלשהו, במסד נתונים רלציוני זה יהיה בטבלה, כמו כן היחס בנוי באמצעות סכמה)
הוא הצהרה מהצורה-

אם שתי tuples של R מסכימים על כל הערכים A1,,An (tuple=רשומה בטבלה), כלומר לשתי רשומות יש בידיוק את הערכים האלו לפי הסדר של הסכמה, אזי הם חייבים להסכים על הערכים B1,B2,Bm ״.

במילים אחרות אם לשתי records בטבלה יש את אותם ערכים בסדר מסויים בסכמה אז ישנה מוסכמה שיהיו להם ערכים מסויים זהים.
בנוסח פורמלי

A1,A2,,AnB1,B2,Bm

ונאמר גם ש

A1,A2,,An  functionally determine  B1,B2,Bm

Pasted image 20230101165631.png|300

נגיד ש R מספק FD אם לכל מופע של יחס R אותו FD יהיה נכון לכל מופע שכזה. נשים לב שזה בעצם הפעלה של איזשהו אילוץ על הטבלה.
כמו כן נשים לב שה FD הבא

A1,A2,,AnB1,B2,Bm

שקול לקבוצת ה FD הבאים

A1A2AnB1A1A2AnB2A1A2AnB3A1A2AnBm

נביט בדוגמה הבאה:
Pasted image 20230101170807.png
הסכמה היא Movies1(title,year,lenght,genre, studioName, starName) .
נשים לב שכל שהטבלה הזאת ״עושה יותר מדי״ היא מחזיקה מידע שיכול להיות שייך לשלוש טבלאות אחרות Movies, Studio , StarsIn .
בהמשך נראה יותר למה הסכמה הנ״ל לא טובה בכלל. אבל כדי להבין למה הסכמה הזאת לא טובה ומה שגוי בעיצוב שלה, עלינו לקבוע מהי התלות הפונקציונלית שמחזיקה את המידע. נוכל לטעון שהתלות הפונקציונלית הבאה תקינה

title year length genre studioName

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

נשים לב אבל ש

title yearstarName

אינו FD תקין שכן ניתן לראות של star wars יש מספר שחקנים וזה הגיוני.
זה נובע מכך שFD קובע אילוץ על כל הטבלה ולא על מופע בודד והעובדה שאנחנו יכולים להחזיק בטבלה מופע עם מספר שחקנים עבור סרט, שוללת את האפשרות שזאת אכן תלות פונקציונלת תקינה.

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

מפתחות

נאמר שקבוצה של ערך או מספר ערכים {A1,A2,,An} הוא מפתח ליחס R אם

  1. הערכים האלה קובעים באמצעות FD את כל הערכים הערכים של היחס. כלומר, כל שתי מופעים שונים של היחס לא מחליטים באופן מלא על הערכים האלו.
  2. לא קיימת תת קבוצה של קבוצת הערכים הנ״ל שקובעת את כל שאר הערכים של R. כלומר מפתח הוא הקבוצה המינימלית ביותר שמכריעה על שאר הערכים.

כאשר מפתח מחזיר ערך יחיד A נסמן את המפתח כולו כ A ולא כ {A} .

בהקשר לטבלה למעלה נוכל להגיד ש {title, year, starName} יהווה מפתח עבור הטבלה Movie1 .לא בעייה להוכיח את זה שכן כבר אמרנו ש כותרת ושנה קובעים את כל הפרמטרים האחרים חוץ משם השחקן. לאחר שהוספנו אותו ברור שיש הכרעה על כל שאר הערכים של הטבלה.

סופר-מפתחות

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

חוקים של תלות פונקציונלית

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

טרנזיטיביות:

A1A2A3AnB1B2B3Bm

וגם

B1B2B3BmC1C2C3Ck

אז

A1A2A3AnC1C2C3Ck

splitting rule:
כפי שרשמנו למעל

A1,A2,,AnB1,B2,Bm

שקול ל:

i[m]:A1,A2,,AnBi

טירוויאליות:

i[n]:A1,A2,,AnAii[n]:A1,A2,,AnֿA1A2A3Am   where:   1mn

ישנו מצב ביניים שבו חלק אבל לא כל התכונות בצד ימין הם גם בצד שמאל. התלות הזאת אינה טריווויאלית אבל ניתן לפשט אותה על ידי הסרה מצד ימין את כל התכונות שמופיעול בצד שמאל כמו בתמונה למטה. בפשטות נוכל להגיד ש A1AnB1Bm שקול ל A1AnC1Ck כאשר C זה כל ה B שלא נמצאים גם ב A .
Pasted image 20230101195213.png|300

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

טרמינולוגיה :

  1. מופע של טבלה או relation instance מייצגת מעין snapshot של הטבלה בנקודת זמן מסויימת.
  2. tuple הוא ערך כלשהו בטבלה כלומר record או שורה בטבלה.

computing the closure of attributes

נניח ש {A1,A2,A3,An} הוא קבוצה שלתכונות ו S היא קבוצה של תלויות פונקציונליות .
נגדיר את ה closure של {A1,A2,A3,An} תחת S כקבוצה התכונות B כך שכל טבלה שמספקת את S גם מספקת את

A1A2AnB

כלומר התלות הנ״ל עוקבת אחרי S .

נסמן את הסגור של {A1,A2,A3,An} תחת S כ

{A1,A2,A3,An}+

נשים לב שיתקיים תמיד

{A1,A2,A3,An}{A1,A2,A3,An}+

מתכונת הטריוויאליות.

חישוב של closure:
בהנתן {A1,A2,A3,An} ו S נרצה לחשב את {A1,A2,A3,An}+

  1. אם נחוץ, פצל את כל האיברים ב S כך שכל FD יהיה רק עם ערך אחד מימין.
  2. נגדיר את X להיות {A1,A2,A3,An}
  3. הוסף לX את כל C כאשר יתקיים שבS נמצא B1,B2,BmC. כך שמתקיים
{B1,B2,Bm}XCX
  1. החזר את X כאשר לא ניתן לבצע עוד את 3.

Pasted image 20230101200406.png|300
התמונה מסבירה את הליך החישוב, בהתחלה אנחנו מוסיפים את כל הפרמטרים עצמם מהכלל הטירוויאלי, לאחר מכן מוסיפים את צד ימין של FD מיד לאחר שהוספנו את צד שמאל שלו ולאחר מכן שוב מרחיבים את החיפוש. בעצם זה מעין סגור טרנזיטיבי של קבוצת התכונות הזאת.

נתבונן על דוגמה:
נניח שיש טבלה עם התכונות A,B,C,D,E,F ונניח שיש לה את ה FD הבאים

ABC,BCAD,DE,CFB

נרצה לחשב את הסגור של {A,B}
אם כן אנחנו יודעים ש A,B כבר שייכים לסגור,
כעת נרצה לקחת את

BCAD

ולפצל אותו ל

BCA,BCD

כעת X={A,B}.
באיטרציה הבאה נשים לב ש ABC שייך לקבוצת ה FD שהגדנו ולכן C ייכנס ל X .
לאחר מכן נראה ש BCD,DE מתקיימים אז באיטרצייה הבאה נכניס את D ולאחר מכן נכניס את E וזהו.
אם כן הגענו למסקנה ש

X={A,B}+={A,B,C,D,E}

בפסודו זה ייראה כך

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	

ההוכחה של זה לא מסובכת אך יכולה להיות ארוכה, צריך להוכיח ש
א) האלגוריתם לא מוסיף תכונות שלא מתאימות כלומר שאכן A1,A2AnB הוא יחס נכון מהתכונות שלמדנו והוא מסופק על ידי טבלה שמספקת את כל מי שבS
הוכחה באינדוקצייה על מספר הפעמים שהגדלנו את X. כלומר לאחר כל צעד אם ניקח DX יתקיים ש A1AnD הוא אכן FD תקין.

בסיס- כאשר לא עשינו אף צעד, במצב זה עבור DX יתקיים ש D הוא אחד מהתכונות ומהתכונה הטריוויאלית מתקיים הדרוש.
צעד- נניח שהוספנו את D לאחר שמצאנו B1B2BmD אם כן אנחנו יודעים מהנחת האינדוקצייה ש

A1A2AnB1B2Bm

מסופק על ידי R . ולכן אוטומטי נובע מתכונת הטרנזיטיביות הדרוש.

ב) צריך להוכיח שהאלגוריתם לא נכשל בלבנות סגור שעוקב אחרי S .
נניח ש A1A2AnB הוא תלות פונקציונלית שהאלגוריתם קבע שהיא אינה עוקבת אחרי S.
כלומר B לא שייך לסגור של התכונות תחת S. נרצה להראות שאכן התלות הנ״ל באמת לא עוקבת אחרי S . כלומר נרצה להראות שיש לפחות מופע אחד של הטבלה שמספק את S אבל לא מספק את A1A2AnB .
נגדיר את המופע הזה כ I ומאוד קל לבנות אותו.
Pasted image 20230101211844.png|300
יש לו רק שתי tuples t,s והם יסיכמו על כל התכונות שבסגור ולא יסכימו על כל מי שלא בסגור.
מכאן קל להוכיח שהמופע הזה עוקב אחרי S מאיך שהאלגוריתם בנוי אבל לא עוקב אחרי A1A2AnB שכן B אינו בסגור.

closures and keys

נשים לב ש {A1,A2,A3,An}+ יהווה את קבוצת כל התכונות של טבלה אם ורק אם A1,An הוא סופר מפתח.
אם כן יש לנו אלגוריתם די פשוט לקביעה האם אוסף של תכונות הוא מפתח:
א) בהינתן {A1,A2,A3,An} חשב את הסגור שלו.
ב) אם הסגור הוא כל התכונות המשך לסעיף ג , אחרת תחזיר false.
ג) הורד כל פעם תכונה מ {A1,A2,A3,An} , הפעל את אלגוריתם למציאת סגור ובדוק האם עדיין כל התכונות נשארו, במידה ועבור אחד מהם לא נשארו כל התכונות, החזר false. אם זה מפתח מיד לאחר הורדת התכונה הראשונה אנחנו אמורים לקבל שהסגור לא מכיל את כל תכונות הטבלה.

Closing Sets of Functional Dependencies

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

מסקנה מידית היא ש אין FD טריוויאלי בבסיס מינימלי.

לדוגמה, ניקח את הטבלה R(A,B,C) כך שכל תכונה מספקת את השתיים האחרות כלומר ,

AB,AC,BA,BC,CA,CB

היא כמובן כוללת בתוכה גם את

ABC,ACB,BCA

ואת הטריוויאלים.
בסיס מינימלי לדוגמה במקרה הזה יהיה

{AB,BC,CA}

זה בסיס כיוון שמחוקי הטרנזיטיביות נוכל לקבל את כל הנ״ל כלומר היא שקולה לקבוצת ה FD של R. וגם אם נוריד איבר אחד מהקבוצה זה כבר לא יהיה בסיס כי לא נוכל להסיק מטרנזיטיביות את השקילות. כמו כן סעיף 3 לא רלוונטי כי יש רק איבר אחד בכל צד.

Armstrong’s axioms

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

רפלקסיביות

if   {B1,Bm}{A1,,An} than  A1AnB1Bm

אוגמנטציה

if   A1AnB1Bm than   A1AnC1CkB1BmC1Ck

ואם יש כפילויות בין Ci,Bj או עם Ai,Ct פשוט נשמיט אותם.

טרנזיטיביות

A1A2A3AnB1B2B3Bm

וגם

B1B2B3BmC1C2C3Ck

אז

A1A2A3AnC1C2C3Ck

Projecting Functional Dependencies

באלגברה רלציונית הקרנהם היא פעולה על R יחס מסויים שבפעולה זו משמיטה מספר מסויים של עמודות והיא מסומנת כ π .
אם כן, נרצה שעבור יחס R עם קבוצה של FD שתסומן כ S, כאשר נעשה ״הקרנה״ על R כלומר נחשב R1=πL(R) כאשר L היא קבוצת התכונות שנשארות לאחר ההקרנה. נרצה לדעת איזה מהFD נשארו ב R1.
את התשובה ניתן להשיג על ידי חישוב ההקרנה של תלות פונקציונלית S שזאת קבוצת כל התלויות ש

  1. עוקבות אחר S
  2. מכילות רק תכונות מ R1
    מאחר ויכולות להיות הרבה תלויות כאלו וברבים מהם גם יתכנו כפילויות, נרצה להקל ולהקטין את הקבוצה הזאת לנוחיותנו.
    באופן כללי החישוב הוא אקספוננציאלי למספר התכונות ב R1 והאלגוריתם ייראה כך:

קלט: טבלה R וטבלה נוספת R1 שמוקרנת מ R וגם S קבוצה של תלויות פונקציונליות ש R מספק
פלט: קבוצת כל התלויות שמוחזקות ב R1
א) הגדר T קבוצה ריקה
ב) עבור כל תת קבוצה של תכונות XR1, חשב את X+ ביחס ל S. פעולה זאת עלולה לכלול תכונות מ R שאינן ב R1 ולכן, נוסיף ל T את כל התלויות הלא טריוויאליות XA כאשר A נמצאת גם ב X+ וגם היא תכונה של R1 .
ג) כעת, T הוא בסיס לכל התלויות שמוחזקות ב R1 אך הוא לא בהכרח מינימלי. נחשב את הבסיס המינימלי באופן הבא
1) אם קיים FD נסמנו FT כך שהוא עוקב אחרי אחד התלויות האחרות ב T , הסר אותו מ T
2) יהי YB תלות ב T עם לפחות שתי תכונות ב Y ויהי Z להיות Y עם תכונה אחת שהורדנו. אם ZB עוקב אחרי כל התלויות ב T כולל YB אז הסר את YB והחלף ב ZB .
3) חזור על כל השלבים הנ״ל בכל הצירופים האפשריים.

נפעיל את האלגוריתם על דוגמה פשוטה להמחשה,
נניח ש R(A,B,C,D) עם התלויות AB,BC,CD . נניח שנרצה להקרין החוצה את התכונה B, כלומר להשאיר את הטבלה R1(A,C,D) . עקרונית, כדי למצוא את התלויות של R1 , נרצה לקחת את הסגור של כל תתי הקבוצות של {A,C,D} , ביחס לקבוצת כל התלויות של R. במקרה הזה יש כמה דרכים פשוטות לחישוב שנוכל לעשות

{A}+={A,C,B,D}

ומכאן ש AC,AD מחזיקים ב R1 .
באופן דומה {C}+={C,D} ו {D}+={D}.
נשים לב שבגלל שהסגור של A מכיל כבר את כל התכונות, אין מה לחשוב על קבוצה שמכילה את A. אם כן נובע מכך הסגור הכפול היחיד שצריך לקחת בחשבון הוא

{C,D}+={C,D}

סך הכל גילינו שב R1 מתקיים ש AC,AD,CD ונוכל לצמצם את AD מטרנזיטיביות ולקבל בסיס מינימלי {AC,CD}