Bonjour,
Tout est dans le titre.
J'ai un exam la semaine prochaine, et ça fait 24h que je me torture les méninges sur la BDD. Sur le sujet de l'an dernier, il y a un exo pour l'optimisation des requetes.
Voila la base de données
Vol( NoVol, partDe, ArriveA, HeureDep)
Personnel(Matricule, Nom, Catégorie, Fonction)
Participer(NoVol, DateDépart, Matricule)
Catégorie: {'Navigant technique'n 'Navigant Commercial', "Non Navigant'}
Etant donné les informations statistiques suivantes:
La fonction 'Pilote' n'est possible que pour la catégorie 'navigant technique';
Card(Personnel)=600;
Card(Participer)=1 000 000;
V(Fonction,Personnel)=20;
V(DateDépart,Participer)=500;
Taille d'un n-uplet de Personnel = 50 octets
Taille d'un n-uplet de Participer = 20 octets
Taille d'un bloc B = 2000 octets
Taille d'un pointeur de bloc = 10
a) En moyenne, combien de vol partent chaque jour? Sachant qu'en moyenne, dans un vol, il y a 10 membres d'équipage du personnel 'Navigant'
J'ai compris par cette question que je devais estimer la taille de cette requete
1 2 3
| SELECT NoVol
FROM Participer p
WHERE p.Date='une date' |
Ce qui me donne en algèbre relationnel
R=PJ(RS(Participer/DateDepart='1/1/2011'),(NoVol))
Et donc:
1 2 3 4 5 6 7 8 9 10
|
R1=RS(Participer/DateDepart='1/1/2011')
Card(R1)=Card(Participer)/V(DateDepart/Participer)
Card(R1)=1 000 000/500=2000
R= PJ(R1,( NoVol))
Card(R)=(1-d) Card(R1) avec d=1-(V(NoVol/R1)/Card(R1))
mais V(NoVol/R1)=Card(R1)/10
exact? Avec la précision de 10 navigant par vol |
Donc
d=1 - 200/2000 = 0.9 --> Card(R)=(1-0.9) * 2000= 200
Est-ce correct?
Question b)
Donnez en nombre de n-uplets la taille du résultat de la requête suivant:
PJ( NJN( RS(Personnel/Catégorie='Navigant Technique' et Fonction= 'Pilote'),
RS(Participer/DateDépart='1/12/2009')), (Matricule))
J'obtiens donc la restriction
1 2 3 4 5 6 7 8 9
|
R1=RS(Personnel/Catégorie='Navigant Technique' et Fonction= 'Pilote');
card(R1) = p(Q1) * p(Q2) * Card(R1) puisque le critère est un 'et'
card(R1)= (1/V(Catégorie/Personnel)) * (1/V(Fonction/Personnel)) * Card(Personnel).
V(Fonction/Personnel) = 20
V(Catégorie/Personnel) = 3 cf la liste des fonctions du sujet.
Card(Personnel) = 600
d'ou
Card(R1)=10 |
La seconde restriction
1 2 3 4 5 6
|
R2=RS(Participer/DateDépart = '1/12/09')
Card(R2)=Card(Participer)/V(DateDépart/Participer)
Card(Participer) = 1 000 000
V(DateDépart/Participer) = 500
d'ou Card(R2) = 2000 |
c'est toujours juste?
Et Maintenant mon problème Je ne vois pas quelle fonction je dois utiliser pour la jointure Natural JoiN.
Est ce que quelqu'un pourrait m'éxpliquer laquelle on dois prendre et quand?
Quand on joint sur des non-clés, sur des clés, je pige pas les autres cas.
Dans mon "cours" j'ai:
Si U1 inter U2 = 0 alors la jointure aura la cardinalité: Card(R1) * Card(R2)
Si U1 inter U2 = clé de R2 alors la cardinalité de la jointure sera <=Card(R1)
Si U1 inter U2 = {A / A n'est ni clé de R1, ni clé de R2} alors on utilise le V(A,R)
Justement dans mon cas la jointure se fait bien sur des clés. Mais prendre uniquement la cardinalité de 10 alors que j'ai 2000 en face, ça me trouble. Parce que la requête affichera pour chaque vol les personnels à bord. On trouvera donc plusieurs fois le même personnel pour des vol différents, ou des dates différentes.
J'espère trouver une aide précieuse à ce sujet.
PS: Je précise bien que ce n'est pas "faitmesdevoirs.com", je veux vraiment capter ce que je fais, parce que recopier bêtement, cela ne m'intéresse pas du tout.
Partager