100 likes | 347 Views
צורות נורמליות: 3NF,BCNF. צורה נורמלית ( Normal Form ) היא תכונה של סכמה רלציונית, המודדת את "טיב" הסכמה מבחינת מניעת כפילויות. נלמד על שתי צורות נורמליות שונות: 3NF, BCNF. צורה נורמלית – BCNF Boyce-Codd Normal Form. מוטיבציה : תלות פונקציונלית במשהו שאיננו מפתח-על היא "דבר רע“.
E N D
צורות נורמליות:3NF,BCNF • צורה נורמלית (Normal Form) היא תכונה של סכמה רלציונית, המודדת את "טיב" הסכמה מבחינת מניעת כפילויות. • נלמד על שתי צורות נורמליות שונות:3NF, BCNF. 236363 - DBMS, צורות נורמליות
צורה נורמלית – BCNFBoyce-Codd Normal Form • מוטיבציה: תלות פונקציונלית במשהו שאיננו מפתח-על היא "דבר רע“. • הגדרה: תהי R סכמה רלציונית, ותהי F קבוצת תלויות פונקציונליות מעל R. R היא ב-BCNF בהינתן F אם לכל תלות פונקציונלית כך ש- X Y F+ , X הוא מפתח-על של R. • אם קיימת תלות לא טריוויאלית בקבוצת שדות שאיננה מפתח על, תכנון הסכמות הרלציוניות הוא לקוי, ובמסד הנתונים עלולות להיווצר כפילויות (תלות פונקציונלית X Y נקראת טריוויאלית אם Y X). 236363 - DBMS, צורות נורמליות
BCNF – המשך • דוגמה: נתונה קבוצת התלויות הפונקציונליות:{(טלפון, קידומת) עיר ,קידומת עיר} = F. הסכמה (עיר, קידומת, טלפון)R איננה ב-BCNF: • הסבר: הסגור F+ כולל את התלות הלא טריוויאלית קידומת עיר, אבל עיר איננה מפתח-על. • כפילויות במסד: למשל, הקידומת של חיפה (04) נשמרת במסד פעמים רבות, כמספר הטלפונים בחיפה. • פירוק ל-BCNF: אם סכמה רלציונית אינה נמצאת בצורה הנורמלית הרצויה (למשל BCNF), אפשר לפרק אותה לתת סכמות שנמצאות בצורה נורמלית זו. 236363 - DBMS, צורות נורמליות
פרוק ל-BCNF • הגדרה: תהי R סכמה רלציונית, תהי F קבוצת תלויות פונקציונליות מעל R, ויהי = {R1,…, Rn} פרוק של R. הוא פרוק ל-BCNF אם כל תת-סכמה Ri היא ב-BCNF בהינתן RiF. • הערה: באופן דומה ניתן להגדיר פרוק לכל צורה נורמלית אחרת, למשל 3NF. • עובדה: תמיד קיים פרוק ל-BCNF שמשמר מידע, אך לא תמיד קיים פרוק ל-BCNF שמשמר תלויות. 236363 - DBMS, צורות נורמליות
פירוק ל-BCNF – המשך • דוגמה: נתונה הסכמה (עיר, קידומת, טלפון)R וקבוצת התלויות הפונקציונליות:{עיר(טלפון,קידומת), קידומתעיר}=F. הפרוק {(עיר, קידומת)R2 ,(עיר, טלפון)R1 }= הוא פרוק ל-BCNF. • פרוק זה משמר מידע, אך כפי שראינו הוא איננו משמר תלויות. • שימו לב: כל סכמה שיש בה שני אטריביוטים או פחות היא ב-BCNF, באופן טריוויאלי (למה?) 236363 - DBMS, צורות נורמליות
BCNF לעומת שימור תלויות • לעתים קרובות יש לבחור בין שימור תלויות לבין BCNF. • קריטריון לבחירה:אופן השימוש הצפוי במסד הנתונים: • הרבה עדכונים של שדה עם כפילויות בסכימה המקורית (החלפת קידומת של עיר) => פירוק ל-BCNF (מונע כפילויות):(עיר, קידומת)R2,(עיר, טלפון)R1. • הרבה הוספות/עדכונים של שדה המופיע בצד שמאל של תלות שלא נשמרת בפירוק (מס' טלפון) => ללא פירוק (שימור תלויות): (עיר, קידומת, טלפון)R 236363 - DBMS, צורות נורמליות
אלגוריתם לפרוק סכמה R ל-BCNF • תהי F קבוצת תלויות פונקציונליות: • חשב את F+. • {R} . • אם כל הסכמות ב- הן ב-BCNF – עצור. • מצא סכמה S שאינה ב-BCNF, כלומר קיימת תלות פונקציונלית X Y ב- F+ כך ש-XY S, Y X ו- X אינו מפתח-על של S. בצע: ( \ {S}) {S \ Y} {XY} • חזור ל-3. • הפרוק שאלגוריתם זה מוצא הוא משמר מידע, אך לא בהכרח משמר תלויות. 236363 - DBMS, צורות נורמליות
פירוק ל-BCNF – דוגמה • דוגמה: נתונה הסכמה R עבור מסד נתונים של בית חולים: R(dname, daddr, id, pname, paddr, pres_no, date, med_name, qnt) dname – שם של רופא (נניח שאין שני שני רופאים עם אותו שם) daddr – כתובת הרופא id – מס' זיהוי של חולה pname – שם החולה paddr – כתובת החולה pres_on – מס' מרשם date – תאריך מתן המרשם med_name – שם של תרופה המופיעה במרשם (באותו מרשם יכולות להופיע כמה תרופות שונות) qnt – כמות התרופה במרשם. • נתונות התלויות הבאות: F= {dnamedaddr, idpname, idpaddr, iddname, pres_no(date,id), (pres_no,med_name)qnt} 236363 - DBMS, צורות נורמליות
דוגמה - המשך • R איננה ב-BCNF, ולכן נפעיל את האלגוריתם: F= {dnamedaddr, idpname, idpaddr, iddname, pres_no(date,id), (pres_no,med_name)qnt} R(dname, daddr, id, pname, paddr, pres_no, date, med_name, qnt) dnamedaddr (dname, id, pname, paddr, pres_no, date, med_name, qnt) (dname, daddr) idpname (dname, id, paddr, pres_no, date, med_name, qnt) (id, pname) idpaddr (dname, id, pres_no, date, med_name, qnt) (id, paddr) 236363 - DBMS, צורות נורמליות
דוגמה - המשך • הפירוק של R (ל-BCNF, משמר מידע) הוא: = {R1(dname,daddr), R2(id,pname), R3(id,paddr), R4(id,dname), R5(id,date,pres_no), R6(pres_no,med_name,qnt)} (dname, id, pres_no, date, med_name, qnt) iddname (id, pres_no, date, med_name, qnt) (dname, id) pres_nodate, id (pres_no, med_name, qnt) (pres_no, date, id) 236363 - DBMS, צורות נורמליות