236363 מערכות מסדי נתונים
description
Transcript of 236363 מערכות מסדי נתונים
1
236363מערכות מסדי נתונים
OQL ו-ODLשפות . 11ותכנון מכוון עצמים
שקפים: עודד סודרסקיעריכה והתאמות: אלדר פישר
2
המודל מכוון העצמים למסדי נתוניםפרט למודל הרלציוני למסדי נתונים, קיימים מודלים נוספים:•
רשומות מתקבל ע"י הקשר בין הישנים יותר, שבהם מודלים –מצביעים ולא ע"י ערכים משותפים:
(hierarchical –מדרגי )היררכי•(networkרשת )•
מודל חדש יותר:–(object-orientedמכוון-עצמים )•
המודל מכוון העצמים דומה למודל הרלציוני, בתוספת רעיונות •מתכנות מכוון עצמים.
מודל זה עדיין אינו מבוסס וסטנדרטי כמו המודל הרלציוני.•
3
ODLמבוא :
ERD היא שיטת מידול; לאחר מידול מסד הנתונים יש לתרגם
ספציפי, למשל מודל היחסים DBMS עבור מודל DDLאותו ל-
(.ת)רלציו
יכולה לשמש )ODL )Object Definition Languageלעומת זאת, למסד נתונים מכוון-עצמים.DDLגם כשיטת מידול וגם כ-
IdeasERD
ODL
Relations
Object-oriented DBMS
Relational DBMS
4
ODL( מחלקות :classes)
או למחלקה ERD שקולה לישות ב-ODL ב-(classמחלקה )
:interfaceבתכנות מכוון-עצמים. היא מיוצגת ע"י הצהרת
interface Movie {
};
קשרים ,(attributesתכונות )למחלקה יכולים להיות
(relationships), במקרה של וOQL גם ( שיטותmethods).
5
ODLתכונות : היא שדה של מחלקה:(attributeתכונה )
interface Movie {attribute string title;attribute integer year;attribute integer length;attribute enum Film {color, blackAndWhite} filmType;
};
)"Gone With the Wind", 1939, 231, color( שורה לדוגמא:
interface Star { דוגמא עם תכונה מרוכבת:attribute string name;attribute Struct Addr {string street, string city} address;
};
6
ODL תכונות : 2כל תכונה יכולות להיות מטיפוס בסיסי או מרוכב.
(:atomicטיפוסים בסיסיים )–
integer, real, char, string, bool
enum TypeName {val0, val1, …}
(:structuredטיפוסים מרוכבים )–
Set<type>, Bag<type>,
List<type>, Array<type, size>
Struct TypeName {type1 field1, type2 field2, …}
7
ODL תכונות : 3מותר:
(integer, real, char, string, bool, enumטיפוס בסיסי )–
(Structתכונה עם תת תכונות )–
( של הנ"לSet, Bag, List, Arrayאוסף )–
אסור:
אוסף של אוסף–
–Structעם אוסף בתוכו
8
ODLמפתחות : הוא תכונה, או קבוצת תכונות, שמזהה עצמים (keyמפתח )
:ערכי מהמחלקה באופן חדinterface Movie )key )title, year(( {
attribute string title;attribute integer year;attribute integer length;attribute enum Film {color, blackAndWhite} filmType;
}; ושונים באחת התכונות year וב-titleלא ייתכנו שני סרטים זהים ב-
האחרות.
אפשר להגדיר מפתחות אחדים:interface Movie )key )title, year(, movieID(
9
ODLקשרים : מבטא יחס בין מחלקות.(relationshipקשר )
:חד-ערכיקשר interface Movie {
relationship Star starOf;};
לכל סרט יש כוכב אחד לכל היותר.
:רב-ערכיקשר interface Movie {
relationship Set<Star> stars;};
לסרט יכולים להיות מספר כוכבים.
10
ODLקשרים : 2מותר:קשר חד-ערכי–(Set, Bag, List, Arrayקשר רב-ערכי ע"י אוסף )–
אסור:אוסף של אוסף–, בפרט אין קשרים עם תכונות או Structקשר עם –
קשרים בין יותר משתי מחלקות
11
ODLקשרים הפוכים :הקשר בד"כ נרצה לשמור, לכל קשר בין שתי מחלקות, גם את
לדוגמא:(.inverse relationshipההפוך )
interface Movie {
relationship Set<Star> stars inverse Star::starredIn ;
};
interface Star {
relationship Set<Movie> starredIn inverse Movie::stars ;
};
זהו קשר רבים-לרבים בין סרטים לבין כוכבים.
12
ODLקשרי אחד-לרבים, אחד-לאחד ::אחד- לרבים. כך ניתן להגדיר קשר חד-ערכי הוא ><Setכפי שראינו, קשר ללא
interface Studio {
relationship Set<Movie> owns inverse Movie::ownedBy;
};
interface Movie {
relationship Studio ownedBy inverse Studio::owns;
};
:אחד-לאחדאו
interface President {
relationship Studio runs inverse Studio::runBy;
};
interface Studio {
relationship President runBy inverse President::runs;
};
13
ODL( ירושה :inheritance)
מאפשרת להגדיר מחלקה מסוימת (inheritanceירושה )
כתת-מחלקה של מחלקה אחרת:
interface Cartoon: Movie {
relationship Set<Star> voices;
};
Cartoon יורש את כל התכונות והקשרים של Movie ,
. Star למחלקה voicesערכי -ובנוסף יש לו את הקשר הרב
14
ODLירושה מרובה : מאפשרת לרשת משתי (multiple inheritanceירושה מרובה )
מחלקות או יותר:interface MurderMystery: Movie {
attribute string weapon;};Interface Cartoon-MurderMystery:
Cartoon, MurderMystery{ };
Cartoon-MurderMystery יורש את כל התכונות והקשרים של Cartoon ושל MurderMystery. הוא יורש בעקיפין גם את כל
.רק פעם אחת, אבל Movieהתכונות והקשרים של
במקרה שיורשים מאבות שונים תכונות או קשרים בעלי שם זהה וטיפוסים שונים, התוצאה אינה מוגדרת.
15
: קשרים לא בינרייםODL ל-ERDמ-קשר בין יותר משתי ישויות )או קשר עם תכונות(:
:ODLיש להפוך את הקשר לישות, ואז לתרגם ל-
interface InCharge {relationship Teacher teacher;relationship Course course;relationship Semester semester;
};
teacher course
semester
in charge
teacher course
semester
in charge
16
: ישויות חלשות?ODL ל-ERDמ-
weak לא קיימות ישויות חלשות )ODL, ב-ERלעומת מודל
entities-זאת מפני שלכל עצם ב .)ODL :יש זיהוי ייחודי משלו
הכתובת שבה הוא מאוחסן. לכן אפשר להבדיל בין שני
עצמים מאותה מחלקה גם אם יש להם אותם ערכים לכל
התכונות.
, לעומת זאת, הישויות מזוהות רק ע"י ערכי התכונות.ERב-
כאילו היא ישות ODL תתורגם ל-ERD ישות חלשה ב-
רגילה.
17
: מח', תכונות בסיסיותERD ל-ODLמ-לא הכל ניתן לתרגום!
ERD מתורגמת לישות ב-ODLמחלקה ב-
ERDתכונה מטיפוס בסיסי מתורגמת לתכונה ב-
ERD מתורגם למפתח ב-ODLאחד המפתחות ב-
interface Movie )key )title, year(( {
attribute string title;
attribute integer year;
attribute integer length;
attribute enum Film {color, blackAndWhite} filmType;
};
Movie
title
year
length
type
18
Struct: תכונות ERD ל-ODLמ- מתורגמת למספר תכונות ODL ב-Structתכונה מטיפוס
, או לתכונה מרוכבת.Struct, כמספר השדות ב-ERDב-
interface Star )key name( {
attribute string name;
attribute Struct Addr
{string street, string city} address;
};
או
Star
name street
city
Star
name Addr
street
city
19
Set: תכונות ERD ל-ODLמ- מתורגמת לתכונה רב-ערכית בתרשים Setתכונה מטיפוס
.ERה-
interface Company )key id( {
attribute integer id;
attribute string name;
attribute Set<Struct Addr{string street,
string city}> addresses;
};
Star
name Addr
street
city
20
Bag : תכונות ERD ל-ODLמ- אין אלא לתרגם לישות חלשה נפרדת, עם Bagתכונה מטיפוס
תכונה נוספת עבור מספר ההופעות.
המפתח: כל שדות התכונה )לא כולל מס' ההופעות(.
interface Company )key id( {
attribute integer id;
attribute string name;
attribute Bag<integer> phones;
};
Company
id name
phone
countnumber
21
List : תכונות ERD ל-ODLמ- גם מתורגמת לישות חלשה נפרדת, עם Listתכונה מטיפוס
.סידוריהתכונה עבור המספר
, ולא השדות המקוריים.המספר הסידוריהמפתח:
interface Company )key id( {
attribute integer id;
attribute string name;
attribute List<Struct Addr{string street,
string city}> addresses;
};
Company
id name
address
street
position
city
22
Array : תכונות ERD ל-ODLמ-, או ע"י חזרה על התכונה List מטופלת כמו Arrayתכונה מטיפוס
.)אם המערך קטן יחסית(
interface Company )key id( {
attribute integer id;
attribute string name;
attribute Array<integer, 2> phones;
};
או
Company
id name phone1
phone2
Company
id name
phone
number
position
23
: קשריםERD ל-ODLמ-interface President {
relationship Studio runs inverse Studio::runBy;};interface Studio {
relationship President runBy inverse President::runs;relationship Set<Movie> owns inverse Movie::ownedBy;
};interface Movie {
relationship Studio ownedBy inverse Studio::owns;relationship Set<Star> stars inverse Star::starredIn;
};interface Star {
relationship Set<Movie> starredIn inverse Movie::stars;};
runs
starredIn
owns
President MovieStudio Star
24
List: קשרי ERD ל-ODLמ- כמפתח: נוספת תכונת מס' סידוריListלקשר מטיפוס
interface Movie {relationship List<Star> stars inverse Star::starredIn;
};interface Star {
relationship Set<Movie> starredIn inverse Movie::stars;};
interface Movie {relationship List<Star> stars inverse Star::starredIn;
};interface Star {
relationship List<Movie> starredIn inverse Movie::stars;};
position starredIn MovieStar
starPositionstarredIn MovieStar
moviePosition
25
Bag: קשרי ERD ל-ODLמ-: נוספת תכונת מס' ההופעותBagלקשר מטיפוס
interface Movie {
relationship Bag<Star> stars inverse Star::starredIn;
};
interface Star {
relationship Set<Movie> starredIn inverse Movie::stars;
};
countstarredIn MovieStar
26
Array: קשרי ERD ל-ODLמ-., או כמס' קשריםList מיוצג כמו Arrayקשר
interface Movie {
relationship Array<Star, 2> stars inverse Star::starredIn;
};
interface Star {
relationship Set<Movie> starredIn inverse Movie::stars;
};
או
position starredIn MovieStar
MovieStarstarredIn1
starredIn2
27
: ירושהERD ל-ODLמ-:ERD הופכת להפרדה ב-ODL ב-ירושה
interface Movie {
};
interface Cartoon: Movie {
};
Movie
Cartoon
isa
28
ODLומסדים מכווני עצמים •ODL+OQL אחד המימושים למודל מכוון-העצמים למסדי :
(SQL3נתונים )מימוש אחר:
•ODL )Object-Definition Language(:
או ניתוח תלויות למודל הרלציוניERDשיטת מידול, כמו –
( למודל Data Definition Languageשפת הגדרה )–מכוון-העצמים
Ideas
ERD
ODL
Relations
Object-oriented DBMS
Relational DBMS
attributes+dependencies
29
interface Movie )extent Movies key )title, year(( {attribute string title;attribute integer year;attribute integer length;attribute enum Film {color,blackAndWhite} filmType;relationship Set<Star> stars inverse Star::starredIn;relationship Studio ownedBy inverse Studio::owns;float lengthInHours)(;stars)out Set<String>(;otherMovies)in Star, out Set<Movie>(
raises)noSuchStar(;};
interface Star )extent Stars key name( {...};interface Studio )extent Studios key name( {...};
ODLתוספות למודל מכוון-העצמים :קבוצת העצמים—שם )סוג העצמים שבקבוצה(מחלקהשם ה
המופע
( עם ערך מוחזר, ללא methodפונקציה )פרמטרים
פונקציה ללא ערך מוחזר, עם פרמטר פלט
פונקציה ללא ערך מוחזר, עם פרמטר חריגקלט, פרמטר פלט, ואפשרות ל
(exception)
30
OQLמבוא :
•OQL )Object Query Language( שפת שאילתא :
( למודל Data Manipulation Languageועדכונים )
מכוון-העצמים
,++Cמשוכנת בשפת תכנות מכוונת-עצמים, כגון •
Smalltalk או Java
SQL ומ-ODLכוללת אלמנטים מ-•
31
OQLטיפוסי משתנים וקבועים :.ODL כמו ב-(:atomicבסיסיים )טיפוסים
integer, real, char, string, bool
enum TypeName {val0, val1, …}
.ODL כמו ב-(:structuredמרוכבים )טיפוסים
Set<type>, Bag<type>,
List<type>, Array<type, size>
Struct TypeName {type1 field1, type2 field2, …}
. של אוסףStruct או אבל כאן מותר גם אוסף של אוסף,–
32
OQLקבועים :מטיפוס בסיסי:
17, 17.5, 'a', "abc", true
מטיפוס מרוכב:
Set(17, 18, 19)
Bag(17, 17, 18)
List("Haifa","Haifa","Tel-Aviv")
Array(5.0, 6.5)
Struct(addr: "1 Main Str., LA", phones: Set(1234, 5678))
33
OQL).( אופרטור הנקודה :myMovie.lengthגישה לתכונה:•
Movie עצם מהמחלקה myMovieכאשר
myMovie.starsגישה לקשר:•Starמחזיר קבוצה של עצמים מהמחלקה
)myMovie.starNames)myStarsגישה לפונקציה:• את שמות כוכבי הסרט )כקבוצת מחרוזות(myStarsל-מציב
Struct:address.streetגישה לשדה של •
myMovie.ownedBy.address.streetהרכבה:•myMovieהרחוב של האולפן שהוא הבעלים של הסרט
34
OQLשאילתות בסיסיות ::SQL ל-תחבירית דומות OQLהשאילתות ב-•
SELECT [DISTINCT] ביטוי,...
FROM אוסף [AS] משתנה,...
[WHERE תנאי]
( קיים במסד הנתונים, או extent — מופע )אוסף•
.תת-שאילתא
— מקבל בכל פעם ערך של רשומה אחת מתוך משתנה•
.האוסף
FROM — כוללים קבועים ומשתנים מחלק ה-ביטוי, תנאי•
.)אפשר להשתמש באופרטור הנקודה(
.(DISTINCT אם יש Set )או Bag — התוצאה•
35
OQLשאילתות בסיסיות—דוגמאות ::השנים שבהן יצא סרט בשם "שר הטבעות"
SELECT m.yearFROM Movies mWHERE m.title = "Lord of the Rings"
:שמות כוכבי הסרטים בשם "לשחרר את ווילי"SELECT s.nameFROM Movies m, m.stars sWHERE m.title = "Free Willy"
:כוכבי הסרטים של אולפן "האחים וורנר"SELECT DISTINCT s.nameFROM Movies m, m.stars sWHERE m.ownedBy.name = "Warner Bros."
36
OQLטיפוסים מרוכבים בפלט :זוגות של כוכבים שגרים באותה כתובת:
SELECT DISTINCT
Struct)star1: s1, star2: s2(
FROM Stars s1, Stars s2
WHERE s1.addr = s2.addr
AND s1.name < s2.name
טיפוס התוצאה:
Set<Struct N{star1:Star,star2:Star}>
37
OQLתת-שאילתות :
. יכול להיות גם תת-שאילתאFROMהאוסף ב-
: שמות כוכבי הסרטים של אולפן "פרמונט"דוגמא:
SELECT DISTINCT s.name FROM
(SELECT m FROM Movies m WHERE
m.ownedBy.name="Paramount")
f, f.stars s
38
OQLסדר התוצאה :הסרטים של אולפן "דיסני", עם מיון ראשוני לפי אורך הסרט
)בסדר יורד( ומיון משני לפי שמו:
SELECT m
FROM Movies m
WHERE m.ownedBy.name = "Disney"
ORDER BY m.length DESC, m.title
(Set או Bag )במקום Listהתוצאה:
39
OQLכמתים ::WHEREבחלק ה- ∀ אפשר להשתמש גם בכמתים ו- ∃
FOR ALL (משתנה) IN (אוסף): (תנאי)
EXISTS (משתנה) IN (אוסף): (תנאי)
: כוכבי הסרטים של אולפן "קולומביה"דוגמא:
SELECT s FROM Stars s
WHERE EXISTS m IN s.starredIn:
m.ownedBy.name = "Columbia"
: בסרטי "פוקס"רק הכוכבים שהופיעו דוגמא:
SELECT s FROM Stars s
WHERE FOR ALL m IN s.starredIn:
m.ownedBy.name = "Fox"
40
OQLביטויים סטטיסטיים :•COUNT, MIN, MAX, SUM, AVGשל ערכיםפים פועלים על אוס :
•COUNT עבור ערכים מטיפוס כלשהו —
•MIN, MAX עבור ערכים מטיפוס בר-השוואה —
)כגון מספר או מחרוזת(
•SUM, AVG עבור ערכים מטיפוס מספרי —
: האורך הממוצע של כל הסרטים במסדדוגמא:
AVG(SELECT m.length FROM Movies m)
41
OQLקיבוץ : הגדרה: אפשר להוסיףSELECT-FROM-WHEREאחרי •
GROUP BY ביטוי:שדה ,....Bags ל-FROM-WHEREמקבץ את הרשומות המתקבלות מ-• כולל את כל הרשומות שיש להן אותם ערכים עבור כל הביטויים Bagכל •
.GROUP BYב-המופיעים .Structs של Setמחזיר •. אחד של רשומותBag מייצג Structכל •.GROUP BY מופיעים כל השדות שב-Structבכל •הוא ערך הביטוי המתאים לשדה )של Structהערך של כל שדה ב-•
.Structהרשומות המיוצג ע"י ה- bag הקיבוץ( עבור.partition שדה בעל השם השמור Structבנוסף, יש בכל • מהצורהStructs של Bag הוא partitionערך השדה •
Struct( רשומה:משתנה ,...)
. והרשומה המתאימה לכל משתנהFROMעם המשתנים המופיעים ב-
42
OQLקיבוץ : דוגמאאולפן, שנה, וסך אורכי הסרטים שהופקו ע"י האולפן בשנה
זו:
SELECT std, yr,
sumLength: SUM(SELECT p.m.length
FROM partition p)
FROM Movies m
GROUP BY std: m.studio, yr: m.year
43
OQLקיבוץ : בחירת חלק מהקבוצות.HAVING אפשר להוסיף תנאי GROUP BYאחרי
.SELECTב-כמו הביטויים המופיעים בתנאי
אולפן, שנה, וסך אורכי הסרטים שהאולפן הפיק בשנה זו,דוגמא: האולפן הפיק לפחות סרט אחד של יותר אבל רק אם
:משעתיים בשנה זו
SELECT std, yr, sumLength:SUM(SELECT p.m.length
FROM partition p)
FROM Movies m
GROUP BY std: m.studio, yr: m.year
HAVING MAX(SELECT p.m.length FROM partition p)
> 120
44
OQLאופרטורים מתורת הקבוצות : אפשר להפעיל את האופרטוריםSetsבין שני
UNION )U(, INTERSECT )∩(, EXCEPT)–(
: הופקו ע"י "מ.ג.מ."לא כל סרטי הריסון פורד שדוגמא:(SELECT DISTINCT m FROM Movies m, m.stars sWHERE s.name = "Harrison Ford")EXCEPT (SELECT DISTINCT m FROM Movies mWHERE m.ownedBy.name = "MGM")
: היא(, המשמעותSet ל-Bag )או בין Bagsבין שני –UNION -סכום מספרי ההופעות בשני הBags–INTERSECT -מינימום מספרי ההופעות בשני הBags–EXCEPT -הפרש מספרי ההופעות בשני הBags אך לא(
(0פחות מ-
45
OQLשיכון בשפה מארחת : בשפת תכנות מכוונת-עצמים OQLאפשר לשכן שאילתות
.++Cמארחת, למשל
השמה למשתנה של השפה המארחת:
Set<Movie> oldMovies;
oldMovies = SELECT DISTINCT m
FROM Movies m WHERE m.year < 1920;
עם אלמנט יחיד:Bag או Setשליפה מ-
Movie s;
s = ELEMENT(SELECT m FROM Movies m
WHERE m.title = "Shrek");
46
OQLשיכון בשפה מארחת : 2.0 מ- רץאינדקסה: ע"י סוגריים מרובעים, Listמ-שליפה
List<Movie> movieList;
movieList = SELECT m FROM Movies m
ORDER BY m.title, m.year;
const int numMovies = COUNT)Movies);
for )int i = 0; i < numMovies; i++({
const Movie mv = movieList[i];
cout << mv.title << " " << mv.year << " "
<< mv.length << endl;
};
47
OQLשיכון בשפה מארחת : 3הגדרת טיפוסים:
typedef Struct{star1:Star, star2:Star} StarPair;
Set<StarPair> pairs =
SELECT DISTINCT
StarPair)star1:s1, star2:s2(
FROM Stars s1, Stars s2
WHERE s1.addr = s2.addr
AND s1.name < s2.name;
48
OQLשיכון בשפה מארחת : 4:constructorיצירת עצמים חדשים: ע"י הפעלת
Studio mgm;
mgm = ELEMENT(SELECT s FROM
Studios s WHERE s.name = "MGM");
Movie gwtw;
gwtw =
Movie)title:"Gone with the Wind",
year:1939,length:239,ownedBy:mgm(;
, Movies extentיוצר עצם חדש ב-.gwtwומציב אותו במשתנה