Progettazione logica
Algoritmo di traduzione
E-A in DDL-SQL
E-A → → SQL → →
Uno schema E-A contiene:
Entità forti Associazioni Entità deboli Gerarchie Categorie
Attributi di entità e relazioni distinti in:
monovalore multivalore
} }
Alberi
Grafi
E-A → → SQL → →
Procedimento di massima:
traduzione delle entità forti, assieme ai loro attributi monovalore traduzione delle relazioni binarie
traduzione delle relazioni ternarie
traduzione delle entità deboli, assieme ai loro attributi monovalore traduzione degli attributi multivalore
traduzione delle gerarchie traduzione delle categorie
E-A → → → → SQL:
traduzione delle entità forti con attributi monovalore
T A
C
D B
create table T ( A dA ,
C dC , D dD ,
primary key ( A ) );
T
C
D B
A
create table T ( A dA ,
C dC , D dD ,
primary key ( C,D )
);
E-A → → → → SQL: traduzione delle relazioni binarie
M N T
S R
CREATE TABLE T ( KT dKT
PRIMARY KEY );
CREATE TABLE S ( KS dKS
PRIMARY KEY );
CREATE TABLE R (
S dKS ,
T dKT ,
PRIMARY KEY ( S, T ), CONSTRAINT SR
FOREIGN KEY ( S ) REFERENCES S( KS ) ON DELETE CASCADE, CONSTRAINT TR
FOREIGN KEY ( T ) REFERENCES T( KT ) ON DELETE CASCADE
ON UPDATE CASCADE );
KS KT
una partecipazione totale non e` codificabile
una partecipazione totale non e` codificabile
NON disponibile
(direttamente) in Oracle 8i
E-A → → → → SQL: traduzione delle relazioni binarie
CREATE TABLE T (
KT dKT
S dKS , CONSTRAINT R
FOREIGN KEY ( S ) REFERENCES S( KS ) ON DELETE CASCADE );
CREATE TABLE S (
KS dKS PRIMARY KEY );
1 N T
S R
KS KT
Traduzione poco efficiente per R "piccola'':
tante coppie (valore, null) in T(KY,R)
PRIMARY KEY,
E-A → → → → SQL: traduzione delle relazioni binarie
N 1 T
S R
KS KT
CREATE TABLE T ( KT dKT
PRIMARY KEY );
CREATE TABLE S ( KS dKS
PRIMARY KEY );
CREATE TABLE R (
T dKT
S dKS ,
PRIMARY KEY (T,S), CONSTRAINT SR
FOREIGN KEY ( S ) REFERENCES S( KS ) ON DELETE CASCADE,
CONSTRAINT TR
FOREIGN KEY ( T ) REFERENCES T( KT ) ON DELETE CASCADE );
Questa soluzione non e` standard!
Si puo` adottare quando R e` "piccola"
a causa delle poche occorrenze di T in R UNIQUE ,
E-A → → → → SQL: traduzione delle relazioni binarie
CREATE TABLE T (
KT dKT PRIMARY KEY, S dKS ,
CONSTRAINT R
FOREIGN KEY ( S ) REFERENCES S( KS ) ON DELETE CASCADE );
CREATE TABLE S (
KS dKS PRIMARY KEY );
1 N T
S R
KS KT
non codificato
E-A → → → → SQL: traduzione delle relazioni binarie
CREATE TABLE T (
KT dKT PRIMARY KEY,
S dKS
CONSTRAINT R
FOREIGN KEY ( S ) REFERENCES S( KS ) ON DELETE CASCADE );
CREATE TABLE S (
KS dKS PRIMARY KEY );
1 N T
S R
KS KT
NOT NULL ,
E-A → → → → SQL: traduzione delle relazioni binarie
CREATE TABLE RT (
KT dKT PRIMARY KEY, S dKS
CONSTRAINT R
FOREIGN KEY ( S ) REFERENCES S( KS ) ON DELETE CASCADE );
CREATE TABLE S (
KS dKS PRIMARY KEY );
1 N T
S R
KS KT
non codificato
NOT NULL ,
E-A → → → → SQL: traduzione delle relazioni binarie
CREATE TABLE RT (
KT dKT PRIMARY KEY, S dKS
CONSTRAINT R
FOREIGN KEY ( S ) REFERENCES S( KS ) ON DELETE CASCADE );
1 1 T
S R
KS KT
CREATE TABLE S (
KS dKS PRIMARY KEY
);
UNIQUE NOT NULL ,
E-A → → → → SQL: traduzione delle relazioni binarie
CREATE TABLE RT (
KT dKT PRIMARY KEY, S dKS
CONSTRAINT R
FOREIGN KEY ( S ) REFERENCES S( KS ) ON DELETE CASCADE );
CREATE TABLE S (
KS dKS PRIMARY KEY
);
1 1 T
S R
KS KT
UNIQUE ,
T
E-A → → → → SQL: traduzione delle relazioni ternarie
KS S KT
U KU
R
CREATE TABLE S (
KS dKS PRIMARY KEY );
CREATE TABLE U (
KU dKU PRIMARY KEY );
CREATE TABLE T (
KT dKT PRIMARY KEY );
CREATE TABLE R (
S dKS NOT NULL vincolo eventuale, U dKU NOT NULL vincolo eventuale, T dKT NOT NULL vincolo eventuale, PRIMARY KEY ( S, U, T),
FOREIGN KEY ( S ) REFERENCES S( KS ) ON DELETE CASCADE,
FOREIGN KEY ( U ) REFERENCES U( KU ) ON DELETE CASCADE,
FOREIGN KEY ( T ) REFERENCES T( KT ) ON DELETE CASCADE
);
W
E-A → → → → SQL:
traduzione delle entità deboli e dei loro attributi monovalore
KE E R
CREATE TABLE E (
KE dKE PRIMARY KEY );
CREATE TABLE W (
KW dKW eventuale vincolo, E dKE eventuale vincolo,
A dKA ,
PRIMARY KEY ( KW, E),
FOREIGN KEY ( E ) REFERENCES E( KE ) ON DELETE CASCADE
);
KW
A B
ogni istanza di W esiste se corrisponde ad una di E
ignorato,
per ora
E-A → → → → SQL: traduzione degli attributi multivalore
KS S A
CREATE TABLE S (
KS dKS PRIMARY KEY );
CREATE TABLE AS ( S dKS ,
A dA ,
PRIMARY KEY ( S, A ), CONSTRAINT MultiA FOREIGN KEY (S ) REFERENCE S(KS) ON DELETE CASCADE );
E-A → → SQL: sintassi per una traduzione incrementale → →
CREATE TABLE T ( ... );
...
ALTER TABLE T
ADD (CONSTRAINT nome_constraint
FOREIGN KEY (U) REFERENCES U(KU) );
annichilito da:
ALTER TABLE T
DROP CONSTRAINT nome_constraint;
E-A → → → → SQL: traduzione di una gerarchia (A)
C
S
KC
T
CREATE TABLE S (
S dKS PRIMARY KEY, AS dAS,
FOREIGN KEY ( S )
REFERENCES C( KC ) );
CREATE TABLE C (
KC dKC PRIMARY KEY, A dA
);
CREATE TABLE T (
T dKT PRIMARY KEY, AT dAT,
FOREIGN KEY ( T )
REFERENCES C( KC ) );
A
AS AT
sovrapposta o disgiunta totale o
parziale
dipendenza di inclusione
dipendenza di inclusione
E-A → → → → SQL: traduzione di una gerarchia (B)
C
S
KC
T
CREATE TABLE S ( S dKS,
AS dAS,
KC dKC PRIMARY KEY, A dA
);
CREATE TABLE T ( T dKT,
AT dAT,
KC dKC PRIMARY KEY, A dA
);
A
d
AS AT
disgiunta
totale
E-A → → → → SQL: traduzione di una gerarchia (C)
C
S
KC
T A
d
AS AT
p(B) not(P(B))
B
CREATE TABLE CST (
KC dKC PRIMARY KEY, A dA,
AS dAS, AT dAT, B dB );
totale o parziale
PUO` essere adatto un booleano (che ORACLE non ha!) attributo
discriminante NOT NULL
per gerarchia totale
E-A → → → → SQL: traduzione di una gerarchia (D)
C
S
KC
T A
o
AS AT
totale o parziale
CREATE TABLE CST (
KC dKC PRIMARY KEY, A dA,
AS dAS, AT dAT
DS BOOLEANO, DT BOOLEANO
);
qualsiasi
combinazione
di valori
E-A → → → → SQL: traduzione di specializzazioni a reticolo
U
S
KU
T
V
create table U
( ku number(2) primary key );
create table S
( ks number(2) primary key , constraint S_subclass_of_U
foreign key (ks) references U(ku) );
create table T
( kt number(2) primary key , constraint T_subclass_of_U
foreign key (kt) references U(ku) );
create table V
( kv number(2) primary key , constraint V_subclass_of_S
foreign key (kv) references S(ks) , constraint V_subclass_of_T
foreign key (kv) references T(kt));
condividono
lo stesso
identificatore
E-A → → → → SQL: traduzione di specializzazioni a reticolo (esempio)
E
Z2 KE
V
create table E ( KE char(1) primary key );
create table V ( E char(5) primary key , constraint VsubE
foreign key (E) references E(KE) );
create table U1 ( E char(2) primary key , constraint U1subE
foreign key (E) references E(KE));
create table U2 ( E char(2) primary key , constraint U2subE
foreign key (E) references E(KE));
create table Z1 ( E char(2) primary key );
create table Z2 ( E char(2) primary key );
create table X ( U1VZ1 char(2) primary key , constraint XsubU1
foreign key (U1VZ1) references U1(E) , constraint XsubV
foreign key (U1VZ1) references V(E) , constraint XsubZ1
foreign key (U1VZ1) references Z1(E));
U1
d d
X U2 Z1
ordine di
traduzione
E-A → → SQL: → → traduzione di una categoria
C
S T
A
u
KS KT
create table S
( KS char(2) primary key , AttS char(2)
, Surr dSurr
, foreign key (Surr) references C(Surr) );
AS AT