Bazy danych 02

Download Report

Transcript Bazy danych 02

Bazy danych
02:
Relacyjny model
danych, języki zapytań
Krzysztof Stencel
Pojęcia pierwotne




A – zbiór nazw atrybutów
D – zbiór wartości atomowych (napisy, liczby,
daty, wartości logiczne)
E – zbiór typów atomowych (integer, float,
string, boolean, date)
T – zbiór nazw relacji
Typy atomowe w SQL (Oracle)







NUMBER, NUMBER(c), NUMBER(c,d)
INTEGER
CHAR(x)
VARCHAR2(x)
DATE (data + czas)
TIMESTAMP (DATE + setne sekundy)
BOOLEAN
Schemat relacji
kol : T → Pfin (A) (nazwie relacji
przyporządkowujemy
skończone zbiory nazw kolumn)
dom : T × A → E (nazwie relacji i nazwie atrybutu
przyporządkowujemy typ
elementarny)
Przykład schematu relacji
T = { Osoba }
kol(Osoba) = { PESEL, Imię, Nazwisko, Wiek}
dom(Osoba, PESEL)
dom(Osoba, Imię)
dom(Osoba, Nazwisko)
dom(Osoba, Wiek)
= CHAR(11)
= VARCHAR2(20)
= VARCHAR2(25)
= NUMBER(3,0)
Schemat relacyjnej bazy danych
SCHrel = T, kol, dom
T–
skończony zbiór nazw tabel
kol – przyporządkowanie tabelom nazw kolumn
dom – przyporządkowanie kolumnom typów
(dziedzin)
Krotka relacji
Jeśli R ∈ T, to krotka t o schemacie R jest funkcją
przypisującą wartości nazwom kolumn:
t : kol(R) → D
dla A ∈ kol(R), t(A) ∈ Ddom(R,A)
Przykład krotki
kol(Osoba) = { PESEL, Imię, Nazwisko, Wiek }
t(PESEL)
t(Imię)
t(Nazwisko)
t(Wiek)
= ‘91081256453’
= ‘Alfred’
= ‘Miśkiewicz’
= 42
t jest krotką o schemacie Osoba.
Egzemplarz relacji i egzemplarz
bazy danych

Jeśli R ∈ T, to relacja o nazwie R jest
skończonym zbiorem krotek o schemacie R.

Egzemplarz relacyjnej bazy danych, to
przyporządkowanie egzemplarza relacji każdej
nazwie relacji zdefiniowanej w schemacie.
Relacja jako tabela
PESEL
Imię
Nazwisko
Wiek
91081256453
Alfred
Miśkiewicz
42
99060134534
Julia
Miśkiewicz
10
05222733453
Klaudia
Miśkiewicz
8
Relacja jako relacja
{
 ‘91081256453’, ‘Alfred’, ‘Miśkiewicz’, 42 ,
 ‘99060134534’, ‘Julia’,
‘Miśkiewicz’, 10 ,
 ‘05222733453’, ‘Klaudia’, ‘Miśkiewicz’, 8 
}
Języki zapytań





Praktyczne: SQL, XQuery
Teoretyczne: algebra relacji (ALG), rachunek
pierwszego rzędu (FOL)
Eksperymentalne: OQL, Lorel, UnQL, SBQL…
Zajmiemy się pierwszymi trzema
Systematyczny kurs SQL na labach
SQL = Structured Query Language



Standard przemysłowy, choć nie zapewnia
przenośności.
Trzy warstwy: podstawowa (SQL-87),
pośrednia (SQL-92) i pełna (SQL-99).
Większość implementacji zgodna z SQL na
poziomie podstawowym.
SQL
= DML (Data Manipulation Language)
+ DDL (Data Definition Language)
+ DCL (Data Control Language)
+ SQL/CLI (API)
+ SQL/MM (multi-media)
+ SQL/Transaction
+ SQL/MED + SQL/JRT + SQL/OLB + ...
Rachunek pierwszego rzędu (FOL)



Zapytania mają postać:
{ xi1, xi2,…, xin : (x1, x2 ,…, xm) }
 to formuła pierwszego rzędu o zmiennych
wolnych x1, x2,…, xm
Szukamy wszystkich wartościowań zmiennych x1,
x2,…, xm spełniających  i dla każdego takiego
wartościowania generujemy krotkę xi1, xi2,…, xin
Algebra relacji (ALG)


Nośnik: wszystkie relacje dla zadanego zbioru
atrybutów i dziedzin
Operacje:
Selekcja

Suma

Rzut

Różnica

Zmiana nazw 
Przecięcie

Złączenie
⋈
Produkt

Selekcja (wybór wierszy)
 – formuła z nazwami kolumn jako zmiennymi
(r) = { t  r : (t) }
kol((r)) = kol(r)

{  x1, x2,…, xm  : (x1, x2,…, xm)  r(x1, x2,…, xm) }
SELECT * FROM r WHERE ;
Rzut (wybór kolumn)
X  kol(r) – pewien podzbiór kolumn
X(r) = { t↾X : t  r }
kol(X(r)) = X

{ xi1, xi2,…, xin : r(x1, x2,…, xm) }
SELECT DISTINCT X FROM r;
Zmiana nazw (kolumn)
p : kol(r)  A – funkcja różnowartościowa
p(r) = { u : tr akol(r) u(p(a))= t(a) }
kol(p(r)) = { p(a) : a  kol(r) }
// obraz p

{  xp(1), xp(2),…, xp(m)  : r(x1, x2,…, xm) }
SELECT a1 AS p(a1),…, am AS p(am) FROM r;
Suma, różnica, przecięcie
kol(r) = kol(s). Wówczas kol(rs)=kol(r)=kol(s).
r  s = { t : tr  ts } r  s = { t : tr  ts }
r  s = { t : tr  ts }
{  x1, x2,…, xm  : r(x1, x2,…, xm)  s(x1, x2,…, xm)}
SELECT * FROM r
UNION
EXCEPT INTERSECT
SELECT * FROM s;

Produkt kartezjański
r  s = { t : t↾kol(r)  r  t↾kol(s)  s }
kol(r  s) = kol(r) ⊎ kol(s)
// suma rozłączna
{  x1,…, xm ,y1,…, yk  : r(x1,…, xm)  s(y1,…, yk) }
SELECT * FROM r,s;
SELECT * FROM r CROSS JOIN s;
// SQL87
// SQL92
Złączenie naturalne
r ⋈ s = { t : t↾kol(r)  r  t↾kol(s)  s }
kol(r ⋈ s) = kol(r)  kol(s)
// suma zwykła
{  x1,…, xm ,z1,…, zi,y1,…, yk  : r(x1,…, xm, z1,…, zi) 
s(y1,…, yk, z1,…, zi) }
Zakładamy, że kol(r)  kol(s) zawiera i kolumn.
Złączenie naturalne (SQL)
SQL87:
SELECT x1,…, xm ,z1,…, zi,y1,…, yk
FROM r,s
WHERE r.z1 = s.z1 AND … AND r.zi = s.zi
SQL92:
SELECT * FROM r NATURAL JOIN s;
SELECT * FROM r JOIN s ON
(r.z1 = s.z1 AND … AND r.zi = s.zi);
SELECT * FROM r NATURAL JOIN s
USING (z1,…,zi);
Złączenie

Złożenie produktu kartezjańskiego z selekcją
r ⋈ s = (r  s)
SELECT * FROM r,s WHERE ;
// SQL87
SELECT * FROM r JOIN s ON ;
// SQL92
SELECT * FROM r INNER JOIN s ON ; // SQL92
Domknięcie



ALG – tak, każda operacja daje relację
skończoną
FOL – nie, wynik może być nieskończony:
{ x,y : r(x)  s(y) }
SQL – tak, ale uwaga na wielozbiory i
DISTINCT.
Niezależność dziedzinowa
i bezpieczeństwo FOL





Dziedzina aktywna = stałe + wartości z relacji
Zapytanie jest niezależne dziedzinowo (n. dz.,
domain independent), gdy dodawanie do
dziedziny elementów nie zmienia jego wyniku
[ Wynik zależy tylko od dziedziny aktywnej ]
Zapytanie jest bezpieczne (safe), gdy spełnia
pewne warunki składniowe (będą dalej)
Nie znamy właściwości zapytań n. dz.
Umiemy sprowadzić każde zapytanie n. dz. do
bezpiecznego
Niezależność dziedzinowa
a spełnialność



Problem decyzyjny, czy formuła I rzędu jest spełnialna,
jest nierozstrzygalny
Jeśli umielibyśmy decydować, czy formuła jest
niezależna dziedzinowo, to też umielibyśmy
decydować, czy formuła I rzędu jest spełnialna
(r(x)  s(y))  
jest bezpieczna wtedy i tylko wtedy, gdy  jest
niespełnialna
Nie może więc istnieć skończony algorytm decydujący,
czy formuła jest niezależna dziedzinowo
Bezpieczny FOL


Zmienne: nieograniczone i ograniczone (mające wartości
z dziedziny aktywnej)
Definicja rekurencyjna ze względu na budowę:
–
–
–
–
–

r(x1, x2,…, xn ) wszystkie ograniczone
x = a, x jest ograniczona (a to stała lub zmienna ograniczona)
¬ wszystkie nieograniczone
1  2 ograniczone są te, które są ograniczone w 1 lub w 2
1  2 ograniczone są te, które są ograniczone w 1 i w 2
Wszystkie zmienne w formule muszą być ograniczone
żeby była bezpieczna
Bezpieczeństwo a niezależność
dziedzinowa


Niech  będzie niezależna dziedzinowo
Każdą zmienną można więc bez zmiany
semantyki ograniczyć do dziedziny aktywnej.
Dodajemy więc czynnik ograniczający dla
każdej zmiennej x (a1, a2,…, an to stałe; r1,
r2,…, rm to symbole relacyjne):
  (x=a1  x=a2  …  x=an
  y1, y2,…, yk (r1(y1, y2,…, yk )  x= y1)
  y1, y2,…, yk (r1(y1, y2,…, yk )  x= y2)
 … [ dla wszystkich relacji i argumentów ]
Prawie równe moce
(prawie robi różnicę)




sFOL = bezpieczne zapytania FOL
nFOL = niezależne dziedzinowo zapytania FOL
sFOL = nFOL = ALG
ALG = SELECT-FROM-WHERE
–
–

bo nie cały SQL!
gdy wszystko otoczyć SELECT DISTINCT * FROM
FOL prawie = ALG (czyli FOL  ALG)
–
Bo zapytania zależne dziedzinowo