![]() |
Pages (3): [1] 2 3 » Show 150 posts per page |
.dsy:it. (http://www.dsy.it/forum/)
- Basi di dati ~ comunicazione digitale (http://www.dsy.it/forum/forumdisplay.php?forumid=108)
-- Esempi di Normalizzazione e decomposizione lossless join (http://www.dsy.it/forum/showthread.php?threadid=31355)
Esempio Normalizzazione
Posto un esercizio di normalizzazione,presente sul sito del prof nel pdf es_misti.pdf. Li ha risolti e commentati Svarions,io giro il tutto perchè possa essere utile a tutti e raccogliere il materiale necessario:
code:
Es 2 Si consideri R(A,B,C,D); per ciascuno dei seguenti gruppi di dipendenze funzionali 1. ABC -> D, D->A; 2. AB->C, AB->D, C->A, D->B; determinare: a) Tutte le chiavi di R. b) Se R è in 3NF. c) Se R è in BCNF; nel caso in cui non lo fosse, discutere l’esistenza (ed eventualmente proporre) di una decomposizione che preservi le dipendenze funzionali.
code:
bc* x(o) = bc x(1) = bc
code:
abc* x(0) = abc x(1) = abcd bcd* x(0) = bcd x(1) = abcd
code:
A* x(0) = A X(1) = A A* = A B* X(0) = B X(1) = B B* = B C* X(0) = C X(1) = CA X(2) = CA C* = CA D* X(0) = D X(1) = DB X(2) = DB D* = DB
code:
AB* X(0) = AB X(1) = ABCD X(2) = ABCD AB* = ABCD AC* X(0) = AC X(1) = AC X(2) = AC AC* = AC AD* X(0) = AD X(1) = AD X(2) = ABD X(3) = ABCD AD* = ABCD BC* X(0) = BC X(1) = BC X(2) = ABC X(3) = ABCD BC* = ABCD BD* X(0) = BD X(1) = BD X(2) = BD BD* = BD DC* X(0) = DC X(1) = DC X(2) = ABCD DC* = ABCD
code:
- AB->C va bene perché AB è chiave - AB->D va bene perché AB è chiave - C->A non va bene perché C non è ne chiave ne super chiave - D->B non va bene perché D non è ne chiave ne super chiave
code:
S1 (C,A) F1 (C->A) S2 (BCD) F2 (D->B)
code:
S1 (D,B) F1 (D -> B) S2 (A,C,D) F2 (C -> A)
__________________
GET DROPBOX
# il grado di lentezza è direttamente proporzionale all'intensità della memoria;il grado di velocità è direttamente proporzionale all'intensità dell'oblio (Kundera) #
BLOG: Byte Strike
ChRiS
code:
Si consideri lo schema di relazione R = (A,B,C,D) e il seguente insieme di dipendenze funzionali: 1. A -> B 2. BC -> D 3. A -> C Rispondere ai seguenti quesiti motivando le risposte date: a) Determinare la chiave o le chiavi dello schema di relazione R. b) Determinare se R e’ in 3NF o BCNF. c) Produrre eventuali decomposizioni e discutere la preservazione dei dati e delle dipendenze funzionali
code:
A* x(0) = A x(1) = ABC x(2) = ABCD
code:
s1 (BCD) f1(BC -> D) s2 (ABC) f2(A -> B,A -> C) f1 U f2 = f
__________________
GET DROPBOX
# il grado di lentezza è direttamente proporzionale all'intensità della memoria;il grado di velocità è direttamente proporzionale all'intensità dell'oblio (Kundera) #
BLOG: Byte Strike
ChRiS
In riferimento a quest' ultimo esercizio...
La domanda che poneva era Produrre eventuali decomposizioni e discutere la preservazione dei dati e delle dipendenze funzionali.
La preservazione dei dati come la discuti?
__________________
PUPINO'S VIDEO
FRANK JAY
UN BLOG
Originally posted by Pupino
In riferimento a quest' ultimo esercizio...
La domanda che poneva era Produrre eventuali decomposizioni e discutere la preservazione dei dati e delle dipendenze funzionali.
La preservazione dei dati come la discuti?![]()
__________________
GET DROPBOX
# il grado di lentezza è direttamente proporzionale all'intensità della memoria;il grado di velocità è direttamente proporzionale all'intensità dell'oblio (Kundera) #
BLOG: Byte Strike
ChRiS
Scomposizione
Ciao! C'è una cosa che non ho capito nella scomposizione:
Ho capito come scegli i 2 gruppi, ma le relative relazioni in f1 e f2 come le trovi?
Re: Scomposizione
Originally posted by dc671228
Ciao! C'è una cosa che non ho capito nella scomposizione:
Ho capito come scegli i 2 gruppi, ma le relative relazioni in f1 e f2 come le trovi?
__________________
GET DROPBOX
# il grado di lentezza è direttamente proporzionale all'intensità della memoria;il grado di velocità è direttamente proporzionale all'intensità dell'oblio (Kundera) #
BLOG: Byte Strike
ChRiS
ok, grazie cmq!
Ciao!
per quanto ne so io le f1 e f2 gli scegli in base ai sottoinsiemi S che tu hai.
per scegliere le S si fa cosi::
si vede la d.f. che nn ti verifica uno delle forme della normalizazzione. metti dentro a S2 tutti gli attributi che si trovano nella tua d.f. che vuoi modificare. e vedi tutte le d.f. che puoi carvarne da questi attributi o dalla lora combinazione. la f2 sara fatta da queste.
La S1 sara fatta dagli attributti rimanenti + un attributo della S2 (xke alla fine ti servira per fare join).
prendo quest esempio
Si consideri lo schema di relazione R = (A,B,C,D) e il seguente insieme di
dipendenze funzionali:
1. A -> B
2. BC -> D
3. A -> C
1)sappiamo che la chiave è la A
2)vediamo le d.f. in che forma saranno
in quest esempio nn sono ne in BCNF ne in 3NF xke la d.f. BC-->D
nn si verifica per nessuna delle due forme.
allora la tua S2 sara fatta da tutti gli attributi di questa d.f. cioè BCD...
S2(B,C,D).
per calcorale la f2 vedi le d.f. che puoi caverne da B,C,D.(per vedere devi guardare anche la freccia --> le tue dip devono avere la direzione della dip.
cioè tu da B nn trovi niente xke hai A->B;A->C; BC->D
La stessa cosa vale per C(cioè nn puoi trovare nessuna d.f.
mentre BC ti da la dip funz BC->D..
per questo la tua f2(BC->D).
la S1 avra come attributi quelli rimanenti piu uno della S2 che servira per fare join("questo penso che la scegli te a caso")
S1(A,B).
la f1 sara fatta dalle dip funz che posso ricavare da queste due.
A->B
A->C
quindi f1(A->B;A->C)
per preservare le dipendeze funzionali dobbiamo avere.
f1 U f2 = f
Ringrazio chi ha iniziato e/o proseguito questa discussione che mi ha permesso di capire la normalizzazione, qui di seguito elenco uno "schemino" dei passi da seguire per effettuare la normalizzazione:
1) Verificare che l'insieme delle dipendenze funzionali date sia minimale, ovvero cercare e rimuovere eventuali dip. funz. o attributi ridondanti.
2) Stabilire quali attributi sono primi, ovvero quali non compaiono mai a destra delle dip funz.
3) Trovare le chiavi, ovvero un insieme di attributi primi e non, che "passando" dalle varie dip funz portano ad avere un insieme di attributi uguale a quello dato dal testo dell'esercizio
4) Controllare se l'insieme R delle dip. funz. é 3NF o BCNF. É BCNF se a sinistra delle dip funz ci sono solo chiavi o superchiavi (attributi che contengono una chiave), 3NF se é BCNF tutto o in parte, o se a destra ci sono solo attributi primi.
5) Effettuare la decomposizione lossless join richiesta (3NF o BCNF). Nel caso che sia BCNF si parte dalla dip funz che la viola e si calcola S2 cioè S2=(S-S1)+CHIAVE S1. Poi si uniscono F1 e F2 e se non danno F non esiste una decomposizione lossless join che preservi le dip funz.
Anche se differisce dal metodo adottato dal prof questo metodo di decomposizione lossless join BNCF é cmq valido, me l'ha confermato lui stesso correggendo un mio esame.
Nei post precedenti al mio viene spiegato come fare la decomposizione lossless join, ma attenzione perchè viene spiegato solo il caso in cui la decomposizione richiesta sia in BCNF, lo svolgimento di una scomposizione 3NF é totalmente diverso.
[EDIT 01-02-09]
Venerdì sono stato a ricevimento dal prof e mi sono fatto spiegare la decomposizione 3nf.
I passaggi da fare sono 4:
1) scrivere le relazioni di ogni dipendenza funzionale
2) accorpare le relazioni che hanno la stessa chiave
3) cercare se é presente una relazione che ha come chiave la chiave "totale" dell'esercizio, ovvero quella trovata calcolando la chiusura all'inizio dell'esercizio.
4) se la chiave non é presente in nessuna relazione, si accorpano più relazioni in modo da avere la chiave in una relazione sola. Ci sono più relazioni da cui é possibile derivare la chiave, che io sappia non c'è un criterio che impone di prendere una piuttosto che l'altra relazione, l'importante é ritrovarsi con una nuova relazione che contiene la chiave "totale" dell'esercizio.
Nella fattispecie il prof mi ha corretto la scomposizione 3nf capitata all'esame del 20 Gennaio. La chiave TOTALE dell'esercizio, é quella trovata calcolandone la chiusura (prima parte di un esercizio della normalizzazione), cosa che ho dato per scontato e di cui non ho ricopiato lo svolgimento. La chiave in questione é AC.
Prima di iniziare l'esercizio bisogna controllare che siano verificate queste 3 condizioni: unicità attributi a destra, assenza di dipendenze funzionali ridondanti, assenza di attributi ridondanti a sinistra.
Le dipendenze funzionali erano (svolgiamo già il passaggio 1):
AD->E R1(A,D,E)
A->F R2(A,F)
AC->B R3(A,C,B)
C->D R4(C,D)
C->F R5(C,F)
la chiave é AC.
passaggio 2:
si combinano R4 e R5 in R6 perchè hanno la stessa chiave cioè C, si compie cioè il famigerato accorpamento.
passaggio 3:
R3 contiene AC, cioè la chiave totale dell'esercizio
passaggio 4:
visto che il passaggio 3 é verificato, non occorre creare una relazione R7 che abbia AC come chiave.
La decomposizione lossless join in 3nf quindi é:
R6(C,D,F)R3(A,C,B)R2(A,F)R1(A,D,E)
Faccio un piccolo addendum al passaggio 4:
supponiamo che R3 sia R3(A,E,D), R3 non contiene la chiave AC. Quindi dovremmo creare una relazione R7 partendo R2+R6, R7 alla fine sarebbe (A,C,D,F).
Nulla ci vieta però di comporre R7 a partire da R1+R6, otterremmo R7(A,D,E,C,F), tuttavia secondo me é meglio partire da R che hanno meno attributi possibili, ma é un parere personale.
Originally posted by karplus
A questo punto bisogna trovare due insiemi R che contengano gli attributi primi della chiave trovata precedentemente, la chiave in questo caso é AC, quindi si combinano R3 e R4:
R3,4(A,B,C,D)
E la parte finale da scrivere per dimostrare che la combinazione di questi due insiemi porta a una decomposizione lossless join é così:
R3,4(A,B,C,D)R1(A,D,E)R2(A,E,F)R5(C,F)
guardate il mio post precedente, lì c'è la procedura spiegatami dal prof per la scomposizione in 3nf.
L'algoritmo viene spiegato bene dal prof qui alla pagina 79.
Viene spiegato anche qui alle pagine 418-420.
in aggiunta a quanto hai spiegato, è meglio chiarire una cosa.
se avessimo avuto
AD->E R1(A,D,E)
A->F R2(A,F)
AC->D R3(A,C,D)
C->D R4(C,D)
C->F R5(C,F)
in questo caso, non bisogna unine R4 con R5, ma inserire la dip.funz di R4 in R3.
Era per precisare che non sempre bisogna unire i gruppi con stessa chiave
grandissimo, questo era un dubbio che mi era rimasto, e in effetti anche ora non me lo spiego.
R4 va in R3 perchè ha sia la C che la D già presenti in R3, giusto?
E questo passaggio ha la "precedenza" sull'accorpare le dip funz con la stessa chiave perchè in R3 é presente la chiave generale di tutto l'esercizio, giusto?
Originally posted by Jaky
Ciao, non è che potresti spiegare + dettagliatamente questo passaggio?
non capisco perchè scegli proprio R3 e R4
Anche questo non mi è tanto chiaro.
Ciao e grazie![]()
All times are GMT. The time now is 16:15. | Pages (3): [1] 2 3 » Show all 38 posts from this thread on one page |
Powered by: vBulletin Version 2.3.1
Copyright © Jelsoft Enterprises Limited 2000 - 2002.