The Entity-Relationship Model

HIGH-LEVEL DATABASE MODELS

בניית שרת זה לא משהו שנעשה בין רגע ויש לו מספר שלבים
Pasted image 20230102180717.png|350
בשלב העיצוב הראשוני נרצה לענות על מספר שאלות חשובות שקשורים לאופן שבו המידע שלנו יאוחסן ואיך מידע יהיה מקושר לפיסת מידע אחר, מהם האילוצים כמו מפתחות וכו.
כמו כן, נרצה שבשלב העיצוב הוא יהיה מספיק high-level כדי להתעלם מהעובדה של האם השרת הוא רלציוני או לא, רק לאחר שלב העיצוב אם נרצה נמיר את מה שבנינו לסכמה רלציונית.
ישנם מספר שיטות כדי לבנות עיצוב שכזה:
הראשונה ובה אתמקד בסיכום זה היא entity-relationship diagram.
השנייה שהיא יותר מוכרת היא UML basics שבמקור עוצבה עבור תכנות מונחה עצמים אבל אומצה גם לתיאור של סכמות .
השלישית והצעירה ביותר היא ODL , שנועדה במקור לתאר שרתים כאוסף של מחלקות ואובייקטים.

E-R model

המודל E/R הוא מודל שבו הבנייה של המידע מיוצגת באופן גרפי על ידי שימוש ב3 עקרונות פשוטים

Entity Sets

יישות הוא אובייקט אבסטרקטי מסוג כלשהי, אוסף של אובייקטים דומים שכאלה נקרא entity set.
יישות באופן מסויים מדמה אובייקט (בהקשר של מונחה עצמים). באופן דומה, entity set מקבילה למחלקה.
חשוב לשים לב ש E/R הוא מודל סטטי לתיאור מידע בלבד ולכן לא נראה דברים כמו מתודות בדיאגרמה הזאת.

דוגמה קלאסים היא טבלת סרטים שבה כל רשומה (שורה) היא אובייקט והקבוצה של כל הסרטים היא הטבלה שמכילה את כל הסרטים.

attributes

ל אוסף יישויות יש תכונות שמקושרות אליו, אלו הם המשתנים של היישות שיכולים להשתנות בין יישות ליישות.
למשל, לסרט יש שם,במאי, אורך, וכו....

בגרסאות שונות של מודל ה E/R הטיפוס של תכונה יכול להיות

  1. פרימיטיבי
  2. struct כמו ב C או tuple עם מספר קבוע של משתנים פרימיטיביים

relationships

חיבורים בין מספר entity sets. למשל החיבור בין טבלת סרטים לטבלת שחקנים יוכל להיות מחובר על ידי חיבור stars in.
למשל יישות של שחקן s ויישות של סרט m יהיו מחוברים כך:

s stars in m

נשים לב שrelationships מחברות בין יישויות.

Entity-Relationship Diagrams

דיגארמת E/R היא גרף שמייצג מספר entity sets , תכונות וקשרים.
כל אלמנט מהסוג הנ״ל הוא קודקוד בגרף ולכל סוג יש צורה מסויימת לקודקוד.
א) entity sets מיוצגים על ידי מלבנים
ב) תכונות מיוצגות על ידי אליפסה
ג) קשרים מיוצגים על ידי מעויין (יהלום)
קשתות מחברות בין entity-set לתכונות שלו וגם ל relationship למשל

Pasted image 20230102192149.png|340
נדבר על הכיוון של החץ בהמשך.

Multiplicity of Binary E/R Relationships

יחס בינארי יכול לחבר כל תכונה של קבוצת יישות לכל מספר של תכונות אחרות בקבוצת יישות אחרת. עם זאת, נפוץ להגביל את הריבוי של יחסים.
נניח ש R הוא יחס שמחבר את E,F ה entity sets אזי:
א) אם כל תכונה מ E יכולה להיות מחוברת על ידי R לכל היותר לתכונה אחת מ F . נאמר ש R הוא many-one מ E ל F. זה בעצם אומר שכמה תכונות בצד אחד יכולות להיות משוייכות לתכונה אחת בשני
Pasted image 20230102214101.png|300
ב) אם R הוא גם many one מ E ל F וגם many one מ F ל E אז נאמר ש ש R הוא one-one. זה בעצם אומר שכל תכונה מאחד יכולה להיות משוייכת לתכונה אחת בשני.
Pasted image 20230102214123.png|300
ג) אם R הוא לא many one לאף אחד מהצדדים אז נאמר שהוא many-many.
Pasted image 20230102214219.png|300

למשל עבור Studio ו Presidents אנחנו יודעים שנשיא יכול לנהל רק סטודיו אחד וכל סטודיו יש לו מנהל אחד ולכן מדובר ב one-one .
Pasted image 20230102214431.png|300
נשים לב שהחץ אומר לכל היותר אחד והוא לא מבטיח שיש בכלל יישות בקבוצה שאכן מצביע עליו.
סימון של ״בידיוק אחד״ יראה ככה
Pasted image 20230102214618.png|300

Multiway Relationships

נוח במודל הזה להגדיר יחסים שמקושרים ליותר מ 2 קבוצות יישויות. בפרקטיקה יחסים מדרגה הגבוהה מ2 נדירות, אך הכרחיות.
multiway relationship בדיאגרמת E/R מיוצגת על ידי קווים מהקודקוד שמייצג את היחס לכל אחד מהentitiy set.

Pasted image 20230102213256.png|400
חץ שכזה אומר שהיישויות האחרות שאינן סטודיו מקושרות לכל היותר ליישות אחת ב Studios.
באופן לא פורמלי אפשר לדמיין את זה כ FD כאשר נמצא בצד ימין והיישויות האחרות נמצאות בצד שמאל. כלומר בתמונה למעלה זה אומר שעבור שחקן וסרט מסויימים יש רק סטודיו שמולו השחקן חתם שהוא ישתתף בסרט. נשים לב שאין חצים לכיוון של Stars ו Movies כלומר שסטודיו יכול להחתים מספר כוכבים לאותו סרט וכוכב יכול לחתום עם סטודיו אחד על מספר סרטים.

Roles in Relationships

ישנה אפשרות שenrty set אחד יופיע פעמיים או יותר עבור relation יחיד. אם זה המצב נצייר מספר קווים מהrelationship ל entryset. כל קו מייצג תפקיד אחר שה entryset משחק ביחסים.
אם כן במצב הזה נצמיד לכל קו תווית או ״תפקיד״.

Pasted image 20230103000120.png|400
כאן למשל ניתן לראות שיש יחס בין יישויות מסויימות של סרטים שאחד הוא סרק מקורי והשני הוא סרט המשך. נשים לב שאחד מהם הוא ביחס של manyone כלומר יכול להיות רק סרט מקורי אחד ויכולים להיות מספר סרטי המשך.

נסתכל על דוגמה נוספת, שכוללת גם יחסים עם מספר כיוונים וגם entitiy set עם מספר תפקידים.
Pasted image 20230103005924.png|400
כעת contracts מערב שתי studios, סטודיו של שחקן וסטודיו של סרט. הכוונה היא שסטודיו מסויים שתחתיו חתום שחקן (באופן כללי בלי קשר לסרט) יכול לתת חוזה לסטודיו אחר להפיק סרט עם השחקן הזה.
כלומר ה relationship ממתואר על ידי רביעייה מהצורה

(studio1,studio2,star,movie)

כאשר studio2 חתום עם studio1 על שימוש של כוכב מ studio1בשביל סרט מ studio2.
נשים לב שהחצים מופנים לstudios משני התפקידים שלו. למרות זאת, אין חצים שמופנים לentitiy sets האחרים. הרציונל הוא שבהינתם שחקן, סרט ואולפן שמפיק את הסרט, יכול להיות רק אולפן אחד שאחרי על השחקן. באופן דומה, רק אולפן אחד אחראי על הפקת סרט כלשהו.

Attributes on Relationships

לפעמים זה מועיל ואפילו הכרחי לחבר תכונה לrelationship במקום לentitiy sets שמחוברים על ידיו.
לדוגמה, אולי נרצה לעקוב אחרי משכורת שמשוייכת לחוזה כלשהו בין שחקן לאולפן עבור סרט מסויים. עם זאת, בעייתי לשייך את זה לשחקן כי שחקן יכול לקבל משכורת שונה לכל סרט. באופן דומה לא הגיוני שלייך משוכרת לאולפן כי אותו אולפן ישלם משכורת שונה לסרט אחר ושחקן אחר.
אבל, נוכל לשייך משכורת ייחודית עם השלישייה (star,movie,studio) עבור Contracts. הקשר יחזיק תכונה של משכורת והתכונות של קבוצת היישויות לא ייפגעו.
Pasted image 20230103015641.png|400

Converting Multiway Relationships to Binary

E/R בניגוד למודלים אחרים לא דורש שיחסים יהיו בינאריים, לכן כדאי לדעת שכל יחס שמחבר בין יותר משתי יישויות יכול להיות מומר לאוסף של קשרים שהם בינאריים ו many one.
כדי לעשות זאת, נצטרך לבנות entitiy set חדש שהיישויות שלו יהיו מכפלה קרטזית של כל מי שהיה ביחס הלא בינארי. זה נקרא connecting entity וזה ממש כמו טבלה מקשרת.
לאחר מכן נבנה many-one relationships מה יישות המחברת לכל אחד מהאחרים שנותן רכיב במכפלה הקרטזית.

למשל עבור הדיגאמה הבאה
Screenshot 2023-02-18 at 23.10.33.png|300

נוכל להמיר אותה לבינארית כך

Screenshot 2023-02-18 at 23.13.01.png|300

תתי מחלקות

כמו שאנחנו מכירים מתכונות תורשה של תכנות מונחה עצמים, יתכן ויהיה לנו סט שהוא Subclass של כלשהו Entity Set קיים. המשמעות של זה היא, מבחינה לוגית, היא שסט Subclass הוא תת מחלקה של Superclass אם מתקיים היחס:

 every <subclass> is a <superclass>

כלומר כל אובייקט מהמחלקה היורשת הוא בעצמו סוג של אובייקט ממחלקת האב. כצפוי, עבור כל אובייקט מ-Entity Set שיורש מסט אב, יהיו את כל הרשומות שמאפיינות את סט האב בנוסף לרשומות שמאפיינות אותו ספציפית. נסמן זאת באמצעות משולש

Pasted image 20230218231935.png|250

Constraints

ישנם מספר הגבלות שניתן לשים על המודל הזה
א) מפתחות - יסומנו על ידי קו תחתון
ב) יחסים
ג) Referential integrity - ״חייב להתקיים״
ד) אחרים - ״קבוצה זו צריכה להכיל לכל היותר 10 איברים״

Referential Integrity

Constraint נוסף שניתן להגדיר עבור Relationships הוא ה-Referential Integrity- כלומר החיוב שלכל ערך מקבוצה אחת חייב להיות כלשהו ערך שמתאים לו מקבוצה אחרת.

Pasted image 20230218233722.png|450

סוג יותר חזק של Referential Integrity הוא ב-Weak Entity Set ובו המזהה של כל אובייקט בסט אחד מאופיין על ידי כלשהו אובייקט מסט אחר.

Pasted image 20230218233800.png|450

למשל בדוגמא זו לא סתם שלכל Product חייב להיות כלשהי התאמת Makes עם חברה אחת שמייצרת אותו, אלא בנוסף לכך יחס ה-Makes מאפיין כל מוצר ב-Product, באופן כזה שה-Key של כל מוצר ב-Product הוא לא רק הערך בשדה ה- .Makes-על ידי יחס ה Company-שמוקצה לו מטבלת ה Manufacturer-שבטבלה זו אלא גם שדה ה Name.

ניתן על ידי כתיבה על הקשתות בדיאגרמה להציג Constraints נוספים על יחסים, כמו למשל בדוגמה הבאה ובו אמנם לכל Team יכול להיות התאמה למספר אנשים מתוך Worker, אבל לא יותר מ-10:

Pasted image 20230218233854.png|450

המרה של ER Diagram ל-DB Scheme

כעת לאחר שתכננו באופן רעיוני דיאגרמת ER שתתאר את בסיס הנתונים שלנו, נרצה להמיר את זה לצורת סכימה של בסיס נתונים אמיתי- ובמקרה שלנו בסיס נתונים רלציוני. Entity Sets תמיד יתורגמו לטבלאות. באופן הכי אינטואיטיבי, לכל Entity Set נגדיר טבלה שמתאימה לו, ובה כל רשומה מתארת אובייקט שמייצג ה-Entity Set ויש לה את כל שדות ה-Attributes שמאפיינים סט זה.

Pasted image 20230218233922.png|450

Many-to-Many Relationships יתורגמו גם הם לטבלאות- כל טבלה מתארת יחס. לכל אחד מהצדדים של ה-Relationship תהיה טבלה נפרדת של ה-Entity Set שלו, והטבלה של ה-Relationship תהיה טבלה נוספת שמכילה מפתחות זרים לכל אחת מהטבלאות כך שכל רשומה שם תייצג צימוד בין אובייקט מטבלה אחת לטבלה אחרת, בלי שום הגבלה על הכמויות. השדות שמחייבת שיהיו בטבלה זו הן אותן שדות של Foreign Keys שיקשרו בינה לבין טבלאות ה-Entity Sets וגם השדות שמאפיינים את ה-Relationship הספציפי הזה.

Pasted image 20230218234004.png|550

One-to-Many Relationships לעומתם לא יתורגמו לטבלאות נפרדות, אלא ייוצגו בטבלה של הצד של ה-Many (כלומר בצד שיוצא ממנו החץ, ולכל אובייקט שם מותאם לכל היותר אובייקט אחר מהטבלה השנייה).

Pasted image 20230218234305.png|550
למשל בדוגמא זו אנחנו יודעים כי לכל Product מתאימה בדיוק חברה אחת שייצרה אותו ביחס ה-Make (ויתכן שלאותה חברה יהיו מספר מוצרים שהיא מייצרת). על כן בטבלה של ה-Product נוכל להוסיף שדה של Manufacturer שיהווה Foreign Key לטבלה של ה-Company, וכך לכל מוצר יהיה כתוב את החברה האחת שמייצרת אותו.

כאשר ניצור טבלה ל-Set Entity שהוא Subclass של Set Entry אחר, בטבלה מה שחיוני שיופיע זה השדות שמאפיינים את ה-Subclass הזה ואת השדה מתוך סט האב שהוא המפתח של עצמים בו. כל שאר השדות של סט האב לא יצטרכו להישמר בטבלה של סט הבן שכן באמצעות המפתח ניתן לקשר ישירות אובייקט מטבלת הבן לטבלת האב ולמצוא את ערכי השדות האלה שם.

Pasted image 20230218234511.png|550

כמו כן, ניתן להגדיר כל Constraint אחר מדיאגרמת ה-ER כפשוט Constraint על הטבלאות המתאימות- הגבלה של שדה שלא יוכל להיות NULL עבור Referential Integrity, הגבלות CHECK לשדות מסוימים וכדומה.

כאשר יהיה לנו Weak Entity Set ובו כל ערך של טבלה אחת מאופיין באופן יחיד ומחייב על ידי אובייקט של טבלה אחרת, נשים לב שבטבלה של ה-Weak Entity Set יהיה חייב להימצא גם שדה המפתח של הטבלה האחרת בה הוא תלוי, שישמש כ-Key נוסף בטבלה זו וכמובן כ-Foreign Key בין שניהם.

Pasted image 20230218234559.png|550

למשל בטבלה זו כל מוצר מ-Product מאופיין באופן מחייב על ידי החברה שמייצרת אותו מתוך Company. על כן, כשנבנה טבלה ל-Product יתחייב להיות שם השדה Manufacturer כמפתח, כי הוא המפתח של הטבלה שניצור ל-Company. כעת בטבלת Product כל מוצר יהיה מאופיין על ידי השם שלו וגם על ידי שם החברה שמייצרת אותו.

כמו כן אם נחזור לטבלאות שמייצגות יחסי Many-to-Many, בטבלאות אלו שדות המפתח יהיו חייבים להיות כל שדות המפתחות של כל הטבלאות משתתפות ביחס זה. אם יש לנו יחס Multi-Way יותר מורכב- ובו חלק מהסטים שמשתתפים הם Many-to-Many וחלק הם Many-to-One, נצטרך להכיל את כל המפתחות של כל הטבלאות שמשתתפות ביחס מלבד המפתחות של הטבלאות בצד ה-One (שנכנס אליהן החץ).

Pasted image 20230218234638.png|550

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