236363 מערכות מסדי נתונים

Post on 13-Jan-2016

111 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

236363 מערכות מסדי נתונים. 11 . שפות ODL ו- OQL ותכנון מכוון עצמים שקפים: עודד סודרסקי עריכה והתאמות: אלדר פישר. המודל מכוון העצמים למסדי נתונים. פרט למודל הרלציוני למסדי נתונים, קיימים מודלים נוספים: מודלים ישנים יותר, שבהם הקשר בין הרשומות מתקבל ע"י מצביעים ולא ע"י ערכים משותפים: - PowerPoint PPT Presentation

TRANSCRIPT

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ומציב אותו במשתנה

top related