620 likes | 795 Views
צורה נורמלית למסמכי XML. עפ"י:. A Normal Form for XML Documents. Arenas & Libkin - PODS 02’ An Information-Theoretic Approach to Normal Forms for Relational and XML Data Arenas & Libkin - PODS 03’. טל הרמתי tal128@cs. סדר יום. 1. הצגת הנושא. 2. הגדרות: DTD ועצי XML , רשומות,
E N D
צורה נורמלית למסמכי XML עפ"י: A Normal Form for XML Documents.Arenas & Libkin - PODS 02’ An Information-Theoretic Approach to Normal Forms for Relational and XML DataArenas & Libkin - PODS 03’ טל הרמתי tal128@cs
סדר יום 1. הצגת הנושא 2. הגדרות: DTD ועצי XML, רשומות, תלויות פונקציונליות 3. הצגת צורה נורמלית ל-XML 4. אלגוריתם נרמול 5. עוד על איכות תכנון מסדי נתונים ו-XML
סדר יום 1. הצגת הנושא 2. הגדרות: DTD ועצי XML, רשומות, תלויות פונקציונליות 3. הצגת צורה נורמלית ל-XML 4. אלגוריתם נרמול 5. עוד על איכות תכנון מסדי נתונים ו-XML
1. הצגת הנושא • עקרונות תכנון מסדי נתונים מבוססי XML • התיאוריה הנוגעת לתכנון מסדי נתונים יחסיים וצורות נורמליות הינה מתקדמת ביותר. • מטרת המסמכים:להציג בסיס תיאורטי מקביל לנושא תכנון טוב של מסמכי XML.
1. הצגת הנושא • כמו במסד יחסי, מסמכי XML יכולים להכיל מידע מיותר (redundant) ומצבים אנומליים של עדכון. • במסד יחסי – נמנע ע"י סכמה מתוכננת היטב. • במסמך XML – אפשר להתייחס ל-DTD כסכמה. אנחנו נתמקד ב-DTD כמנגנון להגדרה של מבנה מסמכי XML. • המטרה:למצוא מנגנון שיבחן מסמכי DTD ויאפשר להמיר אותם למסמכים בנויים היטב
יתירות ואנומליות עדכון – ב-DB יחסי Course S. No S. No S. Name Grade DB St1 St1 Smith 9 SDBI St2 St2 Jones 8 יתירות SDBI St1 St1 Smith 7.5 1. הצגת הנושא הפתרון: BCNF Course S. No S. Name Grade DB St1 Smith 9 SDBI St2 Jones 8 St1 Smith SDBI 7.5 S.No S.Name תלויות פונקציונליות: Course + S.No Grade
יתירות ואנומליות עדכון – במסמכי DTD 1. הצגת הנושא <!ELEMENT courses (course*)> <!ELEMENT course (title, taken_by)> <!ATTLIST course cno CDATA #REQUIRED> <!ELEMENT title (#PCDATA)> <!ELEMENT taken_by (student*)> <!ELEMENT student (name, grade)> <!ATTLIST student sno CDATA #REQUIRED> <!ELEMENT name (#PCDATA)> <!ELEMENT grade (#PCDATA)>
יתירות ואנומליות עדכון – במסמכי DTD יתירות courses course מקרא אלמנט ושמו אטריביוט ושמו בן יחיד ריבוי בנים קשר הכרחי title title taken_by cno cno student name grade sno 1. הצגת הנושא
חזרה למסמך ה-DTD יתירות 1. הצגת הנושא <!ELEMENT courses (course*)> <!ELEMENT course (title, taken_by)> <!ATTLIST course cno CDATA #REQUIRED> <!ELEMENT title (#PCDATA)> <!ELEMENT taken_by (student*)> <!ELEMENT student (name, grade)> <!ATTLIST student sno CDATA #REQUIRED> <!ELEMENT name (#PCDATA)> <!ELEMENT grade (#PCDATA)>
הפתרון- הוספת אלמנט חדש 1. הצגת הנושא <!ELEMENT courses (course*, info*)> <!ELEMENT course (title, taken_by)> <!ATTLIST course cno CDATA #REQUIRED> <!ELEMENT title (#PCDATA)> <!ELEMENT taken_by (student*)> <!ELEMENT student (grade)> <!ATTLIST student sno CDATA #REQUIRED> <!ELEMENT grade (#PCDATA)> <!ELEMENT info number*, name)> <!ELEMENT number EMPTY> <!ATTLIST number sno CDATA #REQUIRED> <!ELEMENT name (#PCDATA)>
ה-DTD אחרי השינוי 1. הצגת הנושא
דוגמא נוספת – ספריית מאמרים בכנסים הבעיה: כל המאמרים באותו issue חייבים להיות באותה שנה (יתירות) הפתרון: הזזה 1. הצגת הנושא <!ELEMENT db (conf*)> <!ELEMENT conf (title, issue*)> <!ELEMENT title (#PCDATA)> <!ELEMENT issue (inproceedings*)> <!ELEMENT inproceedings (author+, title, booktitle)> <!ATTLIST inproceedings key ID #REQUIRED pages CDATA # REQUIRED year CDATA # REQUIRED > <!ELEMENT author (#PCDATA)> <!ELEMENT booktitle (#PCDATA)>
פתרון של הזזת attribute 1. הצגת הנושא <!ELEMENT db (conf*)> <!ELEMENT conf (title, issue*)> <!ELEMENT title (#PCDATA)> <!ELEMENT issue (inproceedings*)> <!ATTLIST issue year CDATA # REQUIRED> <!ELEMENT inproceedings (author+, title, booktitle)> <!ATTLIST inproceedings key ID #REQUIRED pages CDATA # REQUIRED > <!ELEMENT author (#PCDATA)> <!ELEMENT booktitle (#PCDATA)>
סדר יום 1. הצגת הנושא 2. הגדרות: DTD ועצי XML, רשומות, תלויות פונקציונליות 3. הצגת צורה נורמלית ל-XML 4. אלגוריתם נרמול 5. עוד על איכות תכנון מסדי נתונים ו-XML
DTD (Document Type Definitions) S S S 2. הגדרות: DTD DTD = (E,A,P,R,r) E – אלמנטים A – אטריביוטים P – מיפוי אלמנטים (לביטוי רגולרי) R – מיפוי חלקי לאטריביוטים r – השורש {(coursescourse) , (coursetitle) , (coursetaken_by) , (titleS) , (taken_bystudent) , (studentname) , (studentgrade) , (nameS) , (gradeS) } {courses , course , title , taken_by , student , name , grade } {cno , sno } {(coursecno) , (studentsno) } courses E
Path in DTD S 2. הגדרות: DTD • מסלול – w מילה (ביטוי רגולרי) שבה האות הראשונה היא השורש, כל אות wi נמצאת בשפה של P(wi-1) והאות האחרונה בשפה של הקודמת או אטריביוט של האות הקודמת • Length(w) – אורך מסלול = n • Last(w) – אות אחרונה = wn דוגמאות: courses courses.course.taken_by courses.course.taken_by.student.grade.S courses.course.@cno Length(w) = 1 Last(w) = courses Length(w) = 3 Last(w) = taken_by Length(w) = 3 Last(w) = @cno Length(w) = 6 Last(w) = S
מסלולים 2. הגדרות: DTD • paths(D) – אוסף כל המסלולים ב-D. • EPaths(D) – אוסף כל המסלולים ב-D שמסתיימים באלמנט (ולא ב-S או באטריביוט)
XML tree 2. הגדרות: עץ XML
XML tree 2. הגדרות: עץ XML T = (V,lab,ele,att,root) V – קודקודים lab- (label) מיפוי קודקודים לשמות אלמנטים ele- צלעות בין 2 קודקודים או קודקוד וטקסט att- אטריביוטים של קודקודים (מיפוי חלקי) r – השורש {1, 1.1, 1.1.1, 1.1.@cno, …} {(1courses) , (1.1course) , …} {(11.1), (1.11.1.1), (1.1.1“DB")…} {((1.1 , cso)“DB") , ((1.1.2.1 , sno)"st1") }
Paths in XML tree 2. הגדרות: עץ XML • מסלול – w מילה (ביטוי רגולרי) שבה האותיות הן אלמנטים והאות האחרונה היא אלמנט או אטריביוט או טקסט. • w היא מסלול אם קיימים קודקודים שמתאימים לאותיות. האות הראשונה מתאימה לשורש וכל אות wi מתאימה ל-vi וכן vi הוא בן של vi-1. • מסלול יכול להסתיים בקודקוד, באטריביוט או בטקסט של קודקוד. • Paths(T) – אוסף כל המסלולים בעץ T.
קשר בין DTD ו-XML 2. הגדרות: עץ XML • עץ T מציית ל-DTDD – אם יש התאמה מלאה. כל הקודקודים מוגדרים ב-E ויש התאמה של כל קודקוד ובניו.(T conforms to D) • סימון:T ⊨ D. • עץ T תואם ל-DTDD – אם ורק אם paths(T) paths(D). (T is compatible with D)סימון: T ⊳ D.
יחסי הכלה בין עצים 2. הגדרות: עץ XML • מוטיבציה – מעבר ממצב של עץ XML "מסודר" (בנים של אותו קודקוד מסומנים לפי הסדר שלהם) לעץ לא מסודר – שבו אין חשיבות לסדר הקודקודים. • הכלה בין עצי XML – (subsumed) עץ יוגדר כמוכל בעץ אחר אם השורשים זהים, הקודקודים הם קבוצה חלקית של קודקודי העץ המכיל, יש התאמה בין ה-labels ובין האטריביוטים, והבנים של כל קודקוד הם פרמוטציה של הבנים מהעץ המכיל. סימון:T1⋞ T2. • עצים שווי ערך (equivalent) אם T1⋞ T2וגם T2⋞ T1. סימון: T1 ≡T2. עצים הם שווי ערך אם ורק אם הם אם שווים כעצים לא מסודרים.
רשומות (tree tuples) 2. הגדרות: רשומות • רשומות מוגדרות ביחס ל-DTD. • רשומה t ב-DTD D היא פונקציה מ-paths(D)ל- קודקודים ∪ טקסט ∪ NULL המקיימת: • t(r) ≠ NULL • לכל pEPaths(D)t(p) הוא קודקוד או NULL. • לכל ppaths(D)-EPaths(D)t(p) הוא טקסט או NULL. • אם t(p1)=t(p2) והם קודקודים אז p1=p2. • אם t(p1)=NULL ו-p1 היא קידומת של p2 אז t(p2)=NULL. • סימונים: T(D) – אוסף כל הרשומות ב-DTD. • t.p – רשומה t המתאימה למסלול p.
דוגמא לרשומה S S S 2. הגדרות: רשומות t(courses)=1 t(courses.course.@cno)=“67506” t(courses.course.title)=1.1.1 t(courses.course.taken_by. Student.name.s)=“Jones”
עוד דוגמא לרשומה 2. הגדרות: רשומות t1 t2 t1 t2 אם כשמוגדר t1.p מוגדר גם t2.p וכן t1.p≠NULLt1.p=t2.p. t2 מקסימלית ביחס ל-יחס ההכלה
עץ XML ורשומות מקסימליות 2. הגדרות: רשומות treeD(t)- עץ XML שנבנה מתוך רשומה t. למעשה בדוגמא בנינו עץ XML מרשומה. טענה: אם tT(D) אז treeD(t)⊳D (העץ תואם ל-DTD). הגדרה חשובה: tuplesD(T)בהינתן DTD D ועץ XMLT שתואם ל-D: אוסף של רשומות מכסימליות (במונחי ) המקיימות treeD(t)⋞T .
דוגמא לעץ ורשומות 2. הגדרות: רשומות לא שייך כי אינו מקסימלי tuplesD(T)
בניית עץ XML מאוסף של רשומות 2. הגדרות: רשומות תזכורת: tuplesD(T)בהינתן DTD D ועץ XMLT שתואם ל-D: אוסף של רשומות מכסימליות (במונחי ) המקיימות treeD(t)⋞T . אבחנה: tuplesD(T)תת קבוצה סופית של T(D). הגדרה: treesD(X)בהינתן DTD D ואוסף XT(D) של רשומות: העץ המינימלי T (במונחי ⋞) המקיים : - T⊳D (תואם ל-D). - כל רשומה ב-X מוכלת בו.
treesD(X) - דוגמא 2. הגדרות: רשומות treeD(t1) treeD(t2) treesD(X) X={t1, t2}
משפט 2. הגדרות: רשומות בהינתן DTD D ועץ XMLT – אם T⊳D אז treesD(tuplesD([T]) = [T]. ([T] – מחלקת שקילות של עצים לא מסודרים) משמעות:אפשר לבנות מחדש עץ XML מאוסף הרשומות המקסימליות שלו, עד כדי שקילות (במונחי עצים לא מסודרים). הערה: השוויון ההפוך לא מתקיים. מתקיים XtuplesDtreesD(X) . (כי X לא חייב להכיל רשומות מקסימליות ויכול לכלול רשומות המוכלות זו בזו).
תלויות פונקציונליות 2. הגדרות: תלויות פונקציונליות • ההגדרה מתבססת על רשומות. • תלות פונקציונלית (functional dependency) (ת"פ) מעל D היא ביטוי מהצורה S1S2, כאשר S1 ו-S2 הם קבוצות חלקיות לא ריקות של paths(D). • סימון: אוסף כל הת"פ מעל D מסומן FD(D).
תלויות פונקציונליות (המשך) 2. הגדרות: תלויות פונקציונליות • נתון: ת"פ S1S2; T עץ XML תואם D ; • S2paths(D)∪S1. • T מקיים את הת"פ (סימון: T⊨S1S2) אם • לכל שתי רשומות t1,t2tuplesD(T) • t1.S1=t2.S1 וגם t1.S1≠NULLt1.S2=t2.S2. • סימונים: T⊨Σ עבורΣFD(D) אם T⊨σעבור כל σΣ. • T⊨(D,Σ) אם T⊨D וגם T⊨Σ.
תלויות פונקציונליות - דוגמא 2. הגדרות: תלויות פונקציונליות • courses.course.@cno→ courses.course.משמעות- @cno מפתח של קורס. • courses.course.taken_by.student.@sno→ courses.course.taken_by.studentמשמעות- שני סטודנטים שוניםבאותו קורס לא יכולים להיות עם אותו מספר סטודנט. • courses.course.taken_by.student.@sno→ courses.course.taken_by.student.Name.Sמשמעות- שני סטודנטים בעליאותו מספר סטודנט חייבים להיות בעליאותו שם. S
גזירת תלויות פונקציונליות 2. הגדרות: תלויות פונקציונליות • נתון: DTD D ; קבוצת ת"פΣFD(D) ; ת"פ βFD(D). • נאמר ש-(D,Σ) גוזר את βאם כל עץ שתואם D ומקיים את Σ (T⊨(D,Σ)) מקיים גם את β. • סימון: (D,Σ)⊢β. • אוסף כל הת"פ הנגזרות מ- (D,Σ) נקראות הסגור של Σ ומסומנות (D,Σ)+. • חישוב הסגור של ת"פ ב-XML הוא בעיה קשה, והיא מחוץ לגבולות המאמר.
תלויות פונקציונליות טריוויאליות 2. הגדרות: תלויות פונקציונליות • בבסיס נתונים רלציוני – תלות טריוויאלית אחת:אם YX אז XY. • ב-XML: ת"פ β טריוויאלית אם (D,∅)⊢β. • דוגמאות: • לכל pEPaths(D) ו-p’ שייך לקידומת של p: pp’. • לכל p,p.@lpaths(D): pp.@l.
סדר יום 1. הצגת הנושא 2. הגדרות: DTD ועצי XML, רשומות, תלויות פונקציונליות 3. הצגת צורה נורמלית ל-XML 4. אלגוריתם נרמול 5. עוד על איכות תכנון מסדי נתונים ו-XML
הגדרה – צורה נורמלית XNF 3. צורה נורמלית ל-XML XNF – XML Normal Form. בהינתן DTD D ו-ΣFD(D), נגדיר ש- (D,Σ) הוא ב-XNF אם ורק אם לכל ת"פ לא טריוויאלית β(D,Σ)+ מהצורה Sp.@l או Sp.S הת"פ Sp שייכת אף היא ל- (D,Σ)+. אינטואיציה: בכל העצים התואמים ל-D – לכל אוסף ערכי S נמצא ערך יחיד של p.@l (או p.S). במקרה כזה נוכל לשמור אותו רק פעם אחת, ו- p.S נקבע ע"י (D,Σ). (Spaths(D); S≠∅).
XNF – דוגמא 1 3. צורה נורמלית ל-XML • FD1:courses.course.@cno→ courses.course.משמעות- @cno מפתח של קורס. • מתקיים באופן מובנה שקביעת • courses.course.@cno קובעת את • courses.course. ולכן ת"פ זו • עוברת את המבחן. • באופן דומה: • FD2:courses.course.taken_by.student.@sno→ courses.course.taken_by.student
XNF – דוגמא 1 3. צורה נורמלית ל-XML אבל! FD3:courses.course.taken_by.student.@sno→ courses.course.taken_by.student.name.S ת"פ זו אינה גוזרת את התלות courses.course.taken_by.student.@sno→ courses.course.taken_by.student.name הסכמה אינה ב-XNF. X S
XNF – דוגמא 2 3. צורה נורמלית ל-XML FD1:db.conf.title.S→ db.conf. מתקיים db.conf.title.S→db.conf.title אבל: FD2:db.conf.issue→ db.conf.issue.inproceeding.@year לא מתקיימת התלות הבאה: db.conf.issue→ db.conf.issue.inproceeding הסכמה אינה ב-XNF. S
XNF – דוגמא 2 3. צורה נורמלית ל-XML קל לראות שהתיקון שהוצע – הזזת האטריביוט של שנה – פותר את הבעיה ומעביר את הסכימה ל-XNF.
הקשר בין BCNF ו-XNF 3. צורה נורמלית ל-XML • אפשר להעביר כל בסיס נתונים יחסי ל-DTD בצורה פשוטה. • אפשר לייצג כל ת"פ מבסיס הנתונים היחסי כת"פ ב-DTD שיצרנו. • טענה: סכמה יחסית היא ב-BCNF אם ורק אם הייצוג שלה כ-DTD עם הת"פ שהועתקו הם ב-XNF. • כלומר – ניתן להוכיח שקילות בין הצורות הנורמליות.
סדר יום 1. הצגת הנושא 2. הגדרות: DTD ועצי XML, רשומות, תלויות פונקציונליות 3. הצגת צורה נורמלית ל-XML 4. אלגוריתם נרמול 5. עוד על איכות תכנון מסדי נתונים ו-XML
מוטיבציה 4. אלגוריתם נרמול • עד עכשיו ראינו דרכים לבדוק האם סכמת XML, המופיעה בצורת מסמך DTD, היא בצורה נורמלית. כלומר – מתוכננת היטב. • המטרה: כאשר זיהינו סכמה שאינה מתוכננת היטב, למצוא דרך (אוטומטית) להעביר אותה לצורה מתוכננת היטב. • הקושי: בהינתן אוסף ת"פ – למצוא את הסגור.
שתי דרכים לטיפול בבעיות 4. אלגוריתם נרמול • הזזת אטריביוטכמו בדוגמא של המאמרים בכנסים. • יצירת סוג אלמנט חדשכמו הדוגמא של הציונים בקורסים.
הזזת אטריביוט 4. אלגוריתם נרמול r p q Last(p) Last(q) @l @m בהינתן DTD המכיל מסלולים p,qEPaths(D) ו-p.@lpaths(D) – הזזת אטריביוט יוצרת DTD חדש שבו האטריביוט מועבר מ-last(p) ל-last(q) ושמו משונה ל- q.@m. ההזזה כוללת גם טיפול בתלויות הפונקציונליות המתייחסות לאטריביוט שהועבר.
הזזת אטריביוט - דוגמא 4. אלגוריתם נרמול שינוי הת"פ: לפני השינוי: FD2:db.conf.issue→ db.conf.issue.inproceeding.@year אחרי השינוי: FD2:db.conf.issue→ db.conf.issue.@year (ת"פ טריוויאלית)
יצירת סוג אלמנט חדש t tn t1 … @l @l1 @ln 4. אלגוריתם נרמול r p p1 q pn … Last(p1) Last(p) Last(q) Last(pn) @ln @l @l1 בהינתן DTD המכיל מסלולים p,p1…pn,qEPaths(D) ו-p.@l, pi.@lpaths(D) – אנו יוצרים DTD חדש שבו אלמנט חדש t מתחת ל-last(q), יוצרים לו ילדים tn...t1 עם אטריביוטים ln@...@l1 ומעבירים אליו את האטריביוט @l. ההזזה כוללת גם טיפול בתלויות הפונקציונליות המתייחסות לאטריביוט שהועבר.
יצירת אלמנט חדש - דוגמא 4. אלגוריתם נרמול שינוי הת"פ: לפני השינוי: FD3:courses.course.taken_by.student.@sno→ courses.course.taken_by.student.name.S אחרי השינוי: FD3:courses.info.number.@sno→ courses.info.name.S ת"פ זו גוזרת את התלות courses.info.number.@sno → courses.info.name
האם הפעלת השיטות הנ"ל מקדמת אותנו? 4. אלגוריתם נרמול טענה: בכל צעד באחת משתי השיטות (הזזת אטריביוטים או יצירת אלמנט חדש) מתקבל DTD שבו מספר האנומליות (חריגות מ-XNF) קטן יותר. מסקנה: אלגוריתם המפעיל את השיטות הנ"ל מסתיים ובסיומו מתקבל DTD ב-XNF.