This repository was archived by the owner on Mar 15, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrapport.tex
641 lines (585 loc) · 24.3 KB
/
rapport.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
\documentclass[10pt,a4paper]{article}
\usepackage[left=1cm,right=1cm,top=3cm,bottom=3cm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[export]{adjustbox}
\usepackage[french]{babel}
\usepackage{graphicx}
\usepackage{eso-pic}
\usepackage{transparent}
\usepackage[export]{adjustbox}
\usepackage{hyperref} \hypersetup{colorlinks, citecolor=black, filecolor=black, linkcolor=black, urlcolor=black,}
\usepackage{xcolor,listings}
\usepackage{textcomp}
\lstset{upquote=true}
\usepackage{amsmath}
<<<<<<< HEAD
=======
>>>>>>> 41e89b8085cd5cf183291cd27958ceb622a92f67
% 1 : Logo ulb en fond
\newcommand\BackgroundPic{%
\put(0,-47){%
\parbox[b][\paperheight]{\paperwidth}{%
\vfill
\centering
{\transparent{0.09}\includegraphics[width=1.10 \textwidth]{logo_ulb.jpg}}%
\vfill
}
}
}
\begin{document}
\AddToShipoutPicture*{\BackgroundPic}
\begin{titlepage}
\begin{center}
\vspace*{-1.5cm}
\includegraphics[width=8cm]{ULB.jpg}
\vspace{6cm}
\par{\huge \textbf{Rapport Projet}}\bigbreak
\bigbreak
\par{\huge \textbf{\textit{{IMDB: Internet Movie Database}}}}
\vspace{2cm}
\par{\large [INFO-H-303]}
\vspace{2cm}
\par \hrulefill \par
\vspace{1cm}
\bsc{Jacobs} Alexandre
\bsc{}
\bsc{Engelman} David
\bsc{}
\bsc{Engelman} Benjamin
{\emph \\BA2 Informatique}
\vspace{0.7cm}
\par \hrulefill \par
\vspace{2cm}
\par Mai 2017
\end{center}
\end{titlepage}
\newpage
\tableofcontents
\newpage
\section{Introduction}
Dans le cadre du cours de "Base de données", nous avons dû réaliser un projet mettant en application les différents concepts vus en cours et lors des séances de travaux pratiques.
\subsection{Objectif du projet}
L'objectif du projet était de recréer une base de données du type de "IMDB: Internet Movie Database" à partir de fichiers disponibles sur internet. Le projet était divisé en deux grandes parties. La première partie (section \ref{première partie}) consistait en la création d'un diagramme entité-association et d'un diagramme relationnel. La seconde partie (section \ref{deuxieme partie}), la plus pratique, était l'implémentation de la base de données et la création du site web. \\
En plus de devoir faire une base de données, nous avons dû faire les scripts qui permettaient la création de la celle-ci et l'extraction des données qui y sont stockées. Aussi, afin de pouvoir utiliser notre base de données, nous avons créé un site web permettant de rechercher en fonction de critères simples ou avancés des œuvres(film, série ou épisodes) ou des personnes(acteur, directeur, auteur).
\newpage
\section{Première Partie}\label{première partie}
\subsection{Modèle entité-association}
\includegraphics[width = 17cm]{Diag_E-A}
\subsubsection{Contraintes et hypothèses}
\noindent\underline{Contraintes}
\\ \\ L'année de fin d'une série doit être postérieure à l'année de commencement de la série. \\ Un numéro d’épisode ne peut pas être négatif. Une note doit être comprise entre 0 et 10. \\
La date de sortie d’un épisode doit être postérieure ou égale à la date de sortie de la série auquel il appartient.
\\
\\
\noindent\underline{Hypothèses}
\\ \\ Une personne (Auteur, Producteur, Directeur, Acteur) peut n’avoir participé à aucune œuvre.
Une oeuvre peut avoir été tournée dans plusieurs pays, avoir plusieurs langues ainsi que différents genres.\\
L’année de sortie d’une œuvre peut être inconnue. \\
Si un pays se trouve dans la base de données, c’est qu’au moins une Œuvre y a été tournée. \\
Si un genre se trouve dans la base de données, c’est qu’il existe au moins une Œuvre de ce genre. \\
Si une langue se trouve dans la base de données, c’est qu’elle est parlée dans au moins une œuvre. \\
Un acteur peut jouer plusieurs rôles dans une même œuvre. \\
Un rôle peut être joué par plusieurs acteurs (exemple: enfant et adulte). \\
Plusieurs personnes peuvent avoir le même nom et le même prénom, dans ce cas nous leur attribuons également un numéro pour les différencier.\\
Le nom ou le prénom d’une personne peut être inconnu mais pas les deux en même temps.
\subsection{Modèle relationnel}
\noindent
\textbf{Personne}(\underline{Nom, Prénom, Numéro}, Genre)
\\
\\
\textbf{Auteur}(\underline{Nom, Prénom, Numéro})
\\
Auteur.(Nom, Prénom, Numéro) référence Personne.(Nom, Prénom, Numéro)
\\ \\
\textbf{EcritPar}(\underline{Nom, Prénom, Numéro, OID})
\\
EcritPar.(Nom, Prénom, Numéro) référence Auteur.(Nom, Prénom, Numéro)
\\
AuteurOeuvre.OID référence Œuvre.ID
\\
\\
\textbf{Directeur}(\underline{Nom, Prénom, Numéro})
\\
Directeur.(Nom, Prénom, Numéro) référence Personne.(Nom, Prénom, Numéro)
\\ \\
\textbf{DirigePar}(\underline{Nom, Prénom, Numéro, OID})
\\
DirigePar.(Nom, Prénom, Numéro) référence Directeur.(Nom, Prénom, Numéro)
\\
DirigePar.OID référence Œuvre.ID
\\
\\
\textbf{Acteur}(\underline{Nom, Prénom, Numéro})
\\
Acteur.(Nom, Prénom, Numéro) référence Personne.(Nom, Prénom, Numéro)
\\
\\
\textbf{Rôle}(\underline{Rôle, Nom, Prénom, OID})
\\
Rôle.OID référence Œuvre.ID
\\
\\
\textbf{Œuvre}(\underline{Référence}, Titre, Note, AnnéeSortie)
\\
\\
\textbf{Pays}(\underline{Nom})
\\
\\
\textbf{PaysOeuvre}(\underline{Nom, OID})
\\
Nom référence Pays.Nom
\\
OID référence Œuvre.ID
\\
\\
\textbf{Genre}(\underline{Nom})
\\
\\
\textbf{GenreOeuvre}(\underline{Nom, OID})
\\
Nom référence Genre.Nom
\\
OID référence Œuvre.ID
\\
\\
\textbf{Langue}(\underline{Nom})
\\
\\
\textbf{LangueOeuvre}(\underline{Nom, OID})
\\
Nom référence Langue.Nom
\\
Référence référence Œuvre.ID
\\
\\
\textbf{Film}(\underline{FilmID})
\\
Film.FilmID référence Œuvre. ID
\\
\\
\textbf{Série}(\underline{SerieID}, AnnéeFin)
\\
Série.SerieID référence Œuvre.SerieID
\\
\\
\textbf{Episode}(\underline{EpisodeID},TitreE, NuméroE, SID)
\\
Episode.EpisodeID référence Œuvre.ID
\\
Epidode.SID référence Serie.SerieID
\\
\\
\textbf{Administrateur}(\underline{Adresse mail}, mot de passe)
\subsubsection{Contraintes modèle relationnel}
\noindent Episode.Date de sortie >= Serie.Date de sortie \\
RéférenceS est unique dans la relation saison (une saison ne peut appartenir qu’à une série). \\
RéférenceS est unique dans la relation Episode (un Episode ne peut appartenir qu’à une saison). \\
Référence est unique dans la relation Rôle (un Rôle ne peut appartenir qu’à une Œuvre).
\newpage
\section{Deuxième Partie}\label{deuxieme partie}
\subsection{Méthode d'extraction des données}
Pour l'extraction des données qui seront insérées dans notre base de données, nous avons tout d'abord réalisé un script bash permettant le téléchargement des fichiers qui nous étaient nécessaires. En ce qui concerne le traitement des fichiers téléchargés, nous avons réalisé un autre script bash qui lui fait appel à différents parsers écrit en Python. Ces scripts servent à formater les fichiers selon un standard que nous nous sommes fixés et ainsi permettre l'insertion des données dans la base de données. Lors du Parsing, nous avons choisi de garder uniquement les oeuvres tournées entre 2000 et 2017. Quand la date de sortie d'un film ou d'une série était inconnue, nous ne l'avons pas retenue. Lorsqu'une série commençait avant 2017, nous avons pris tous ses épisodes.
\subsection{Méthode d'insertion dans la base de données}
Pour insérer toutes nos données le plus rapidement possible, nous avons choisi d'utiliser la commande SQL "LOAD DATA INTO", utilisant les fichiers résultant de notre parsing. Si des épisodes avaient une date inconnue, nous leur avons attribué la valeur 0. Pour les notes nous avons choisit -1 car 0 n'était pas une valeur aberrante.
\vskip 10pt
Pour garantir l'intégrité des données, nous avons utilisé un trigger lors de la mofication des dates. Ce trigger permet de s'assurer que la date de fin d'une série est inférieure ou égale à la date de début.
\vskip 10pt
Pour accélérer, certaines reqêtes, nous avons également créer des index à des endroits clés.
\subsection{Requêtes demandées}
Les requêtes demandées étaient les suivantes:
\begin{list}{-}{}
\item R1 : Les acteurs qui ont joué toutes les années entre 2003 et
2007.
\item R2 : Les auteurs qui ont écrit au moins deux films pendant la
même année.
\item R3 : Les acteurs Y qui sont à une distance 2 d'un acteur X. Un
acteur Y est à une distance 1 d'un acteur X si ces deux acteurs
ont joué dans le même film.
\item R4 : Les épisodes de série où il n'y a aucun acteur masculin.
\item R5 : Les acteurs qui ont joué dans le plus de séries.
\item R6 : Les séries avec leur nombre total d'épisodes, le nombre
d'épisodes moyen par an et le nombre d'acteurs moyen par saison
depuis leur année de création et ce pour toutes les séries dont la
note est supérieure à la moyenne des notes des séries.
\end{list}
\subsubsection{SQL}
\definecolor{backcolour}{rgb}{0.95,0.95,0.92}
\begin{lstlisting}[
language=SQL,
backgroundcolor=\color{backcolour},
showspaces=false,
basicstyle=\ttfamily,
keepspaces=true,
numbers=left,
numbersep=5pt,
numberstyle=\tiny,
commentstyle=\color{blue},
caption = Requête 1,
captionpos = b,
tabsize = 4,
keywordstyle=\color{magenta},
breakatwhitespace=false,
breaklines=true,
]
/*R1*/
SELECT Nom, Prenom, Numero
FROM Acteur a
WHERE (SELECT count(distinct AnneeSortie)
FROM (
SELECT AnneeSortie, Nom, Prenom, Numero
FROM Oeuvre o INNER JOIN Role r
ON ID = OID
WHERE AnneeSortie BETWEEN 2003 AND 2007) t
WHERE t.Prenom = a.Prenom and t.Nom = a.Nom and t.Numero = a.Numero) = 5;
\end{lstlisting}
\begin{lstlisting}[
language=SQL,
backgroundcolor=\color{backcolour},
showspaces=false,
basicstyle=\ttfamily,
keepspaces=true,
numbers=left,
numbersep=5pt,
numberstyle=\tiny,
commentstyle=\color{blue},
caption = Requête 2,
captionpos = b,
tabsize = 4,
keywordstyle=\color{magenta},
breakatwhitespace=false,
breaklines=true,
]
/*R2*/
SELECT distinct Nom, Prenom, Numero
FROM(
SELECT AnneeSortie, Nom,Prenom, Numero
FROM Oeuvre o
INNER JOIN Film f ON o.ID = f.FilmID
INNER JOIN EcritPar ON ID = OID
group by AnneeSortie, Nom, Prenom, Numero
having count(*) >=2 )t;
\end{lstlisting}
\begin{lstlisting}[
language=SQL,
backgroundcolor=\color{backcolour},
showspaces=false,
basicstyle=\ttfamily,
keepspaces=true,
numbers=left,
numbersep=5pt,
numberstyle=\tiny,
commentstyle=\color{blue},
caption = Requête 3,
captionpos = b,
tabsize = 4,
keywordstyle=\color{magenta},
breakatwhitespace=false,
breaklines=true,
]
/*R3*/
SELECT DISTINCT Nom, Prenom, Numero
FROM(
SELECT OID
FROM(
SELECT R2.OID
FROM(
SELECT T2.Nom, T2.Prenom, T2.Numero, T2.OID
FROM(
SELECT R1.Prenom, R1.Nom, R1.Numero, R1.OID
FROM (
SELECT *
FROM Role
WHERE Nom = 'Elliott' AND Prenom = 'Missy' AND Numero = 'NA') AS T
JOIN Role R1 ON T.OID = R1.OID) AS T2
INNER JOIN Film F ON F.FilmID = T2.OID) AS T3
JOIN Role R2 ON T3.Prenom = R2.Prenom AND T3.Nom = R2.Nom AND T3.Numero = R2.Numero) AS T4
INNER JOIN Film F2 ON F2.FilmID = T4.OID) AS T5
JOIN Role R3 ON T5.OID = R3.OID;
\end{lstlisting}
\begin{lstlisting}[
language=SQL,
backgroundcolor=\color{backcolour},
showspaces=false,
basicstyle=\ttfamily,
keepspaces=true,
numbers=left,
numbersep=5pt,
numberstyle=\tiny,
commentstyle=\color{blue},
caption = Requête 4,
captionpos = b,
tabsize = 4,
breakatwhitespace=false,
breaklines=true,
keywordstyle=\color{magenta},
]
/*R4*/
SELECT DISTINCT EpisodeID
FROM Episode e
WHERE NOT EXISTS(
SELECT Genre, EpisodeID
FROM Role INNER JOIN Personne ON Personne.Nom = Role.Nom AND Personne.Prenom = Role.Prenom AND Personne.Numero = Role.Numero
WHERE genre = 'm' AND OID = e.EpisodeID);
\end{lstlisting}
\begin{lstlisting}[
language=SQL,
backgroundcolor=\color{backcolour},
showspaces=false,
basicstyle=\ttfamily,
keepspaces=true,
numbers=left,
numbersep=5pt,
numberstyle=\tiny,
commentstyle=\color{blue},
caption = Requête 5,
captionpos = b,
tabsize = 4,
breakatwhitespace=false,
breaklines=true,
keywordstyle=\color{magenta},
]
/*R5*/
SELECT Prenom, Nom, Numero, count(*)nb
FROM(
SELECT SID, Prenom, Nom, Numero
FROM Episode
INNER JOIN Role on OID = EpisodeID
GROUP BY SID, Prenom, Nom, Numero)t
GROUP BY Prenom, Nom, Numero
ORDER BY nb desc
LIMIT 1
\end{lstlisting}
\newpage
\begin{lstlisting}[
language=SQL,
backgroundcolor=\color{backcolour},
showspaces=false,
basicstyle=\ttfamily,
keepspaces=true,
numbers=left,
numbersep=5pt,
numberstyle=\tiny,
commentstyle=\color{blue},
caption = Requête 6,
captionpos = b,
tabsize = 4,
breakatwhitespace=false,
breaklines=true,
keywordstyle=\color{magenta},
]
/*R6*/
SELECT T3.SID, ep_num, avg_ep_by_year, avg_actor_by_season
FROM (
(SELECT ID, count(*) as ep_num
FROM(
SELECT ID, EpisodeID
FROM(
SELECT ID
FROM Serie INNER JOIN Oeuvre on Oeuvre.ID = Serie.SerieID
WHERE note >(
SELECT AVG(note)
FROM(
SELECT note
FROM Serie INNER JOIN Oeuvre on Oeuvre.ID = Serie.SerieID
WHERE note != -1 and AnneeSortie !=0) as t)) as Series_OK
INNER JOIN Episode ON Series_OK.ID = Episode.SID) as t
GROUP BY ID)T1
INNER JOIN
(
SELECT SID, avg(num) as avg_actor_by_season
FROM(
SELECT SID, count(*) as num
FROM(
SELECT Nom, Prenom, Numero, SID, Saison
FROM(
SELECT SID, EpisodeID, Saison
FROM Episode INNER JOIN Serie on SerieID = SID
WHERE Saison != -1)t
INNER JOIN Role on EpisodeID = OID
GROUP BY Nom, Prenom, Numero, SID, Saison)t2
GROUP BY SID, Saison)t3
GROUP BY SID)T2
on T1.ID = T2.SID
INNER JOIN
(
SELECT t5.SID, AVG(num) as avg_ep_by_year
FROM(
SELECT t6.SID, count(*) as num
FROM(
SELECT SID, ID, AnneeSortie
FROM Oeuvre
INNER JOIN Episode on EpisodeID = ID)t6
WHERE AnneeSortie != 0
GROUP BY t6.SID, AnneeSortie) as t5
GROUP BY t5.SID)T3
on T1.ID = T3.SID
)
\end{lstlisting}
\subsubsection{Algèbre relationnel}
\begin{list}{*}{}
\item Requête 1
\\ \\
$
RoleOeuvre \leftarrow \sigma_{ AnneeSortie > 2002 \wedge AnneeSortie < 2008 } ( Oeuvre \ o \bowtie_{ r.OID = o.ID } Role \ r)
$\\$
RoleOeuvre \leftarrow \pi_{AnneeSortie, Nom, Prenom, Numero}(RoleOeuvre) $\\
$AnneeSortie \leftarrow \pi_{AnneeSortie}(RoleOeuvre)$\\
$R1 \leftarrow \pi_{Nom, Prenom, Numero}(RoleOeuvre / AnneeSortie)$
\\
\\ \item Requête 2
\\ \\
$ FilmOeuvre \leftarrow Oeuvre \bowtie_{ID = FilmID} Film$ \\
$FilmAuteur \leftarrow FilmOeuvre \bowtie_{ID = OID} EcritPar$ \\
$FilmAuteur' \leftarrow FilmAuteur$\\
$Auteur2Film \leftarrow FilmAuteur \ f \bowtie_{f.ID \neq a.ID \wedge \\
f.AnneeSortie = a.AnneeSortie \wedge f.Nom = a.Nom \wedge f.Prenom = a.Prenom \wedge f.Numero = a.Numero} FilmAuteur' \ a$\\
$R2 \leftarrow \pi_{Nom, Prenom, Numero} (Auteur2Film)$
\\
\item Requête 3 (exemple avec Bruce Willis)
\\ \\
$ T \leftarrow \pi_{Nom, Prenom, Numero} (\sigma_{Nom = "Willis", Prenom = "Bruce"(Role)})$ \\
$ T2 \leftarrow \pi_{R1.Prenom, R1.Nom, R1.Numero, R1.OID} (T \bowtie_{T.OID = R.OID} Role \ R1 )$ \\
$ T3 \leftarrow \pi_{R2.OID} (T2 \bowtie_{T2.Prenom = R2.Prenom \wedge T2.Nom = R2.Nom \wedge T2.Numero = R2.Numero} Role R2)$ \\
$ Res \leftarrow \pi_{Nom, Prenom, Numero} (T3 \bowtie_{T3.OID = R3.OID} Role \ R3)$
\\
\\
\item Requête 4
\\ \\
$Episode \leftarrow \pi_{EpisodeID}(Episode)$\\
$PersonneRoleM \leftarrow Personne \ p \bowtie_{p.Nom = r.Nom \wedge p.Prenom = r.Prenom \wedge p.Numero = r.Numero \wedge p.Genre='m'} Role \ r$\\
$PersonneRoleMEpisodes \leftarrow \pi_{EpisodeID} (PersonneRoleM \bowtie {OID=EpisodeID}) Episode$\\
$R4 \leftarrow \pi_{EpisodeID, SID}(Episode - PersonneRoleMEpisodes)$
\\
\\
\end{list}
\subsubsection{Calcul relationnel tuple}
\begin{list}{*}{}
\item Requête 1
\noindent
\[\begin{aligned}
\{ a.Nom, a.Prenom, a.Numero | Acteur(a) \wedge \exists r1, r2, r3, r4, r5, o1, o2, o3, o4, o5 ( \\
Oeuvre(o1) \wedge Oeuvre(o2) \wedge Oeuvre(o3) \wedge Oeuvre(o4) \wedge \\
Oeuvre(o5) \wedge Role(r1) \wedge Role(r2) \wedge Role(r3) \wedge \\
Role(r4) \wedge Role(r4)\wedge \\
r1.Nom = a.Nom \wedge r1.Numero = a.Numero \wedge \\
r1.Prenom = a.Prenom \wedge \\
r2.Nom = a.Nom \wedge r2.Numero = a.Numero \wedge \\
r2.Prenom = a.Prenom \wedge \\
r3.Nom = a.Nom \wedge r3.Numero = a.Numero \wedge \\
r3.Prenom = a.Prenom \wedge \\
r4.Nom = a.Nom \wedge r4.Numero = a.Numero \wedge \\
r5.Prenom = a.Prenom \wedge \\
r5.Nom = a.Nom \wedge r5.Numero = a.Numero \wedge \\
o1.ID = r1.ID \wedge o1.AnneeSortie = 2003 \wedge \\
o2.ID = r2.ID \wedge o2.AnneeSortie = 2004 \wedge \\
o3.ID = r3.ID \wedge o3.AnneeSortie = 2005 \wedge \\
o4.ID = r4.ID \wedge o4.AnneeSortie = 2006 \wedge \\
o5.ID = r5.ID \wedge o5.AnneeSortie = 2007) \}
\end{aligned}\]
\item Requête 2 :
\noindent
\[\begin{aligned}
\{ a1.Nom, a1.Prenom, a1.Numero | EcritPar(a1) \wedge \exists o1, o2, a2, f1, f2 ( \\
Oeuvre(o1) \wedge Oeuvre(o2) \wedge EcritPar(a2) \wedge \\
Film(f1) \wedge Film(f2) \wedge \\
o1.ID \neq o2.ID \wedge \\
o1.ID = f1.ID \wedge o1.ID = a1.ID \wedge \\
o2.ID = f2.ID \wedge o2.ID = a2.ID \wedge \\
a1.Nom = a2.Nom \wedge \\
a1.Prenom = a2.Prenom \wedge \\
a1.Numero = a2.Numero \wedge \\
o1.AnneeSortie = o2.AnneeSortie) \}
\end{aligned}\]
\item Requête 3 (exemple avec Bruce Willis)
\noindent
\[\begin{aligned}
\{ r1.Nom, r1.Prenom, r1.Numero | Role(r1) \wedge \exists f1 \exists f2 \exists f3 \exists r2 \exists r3\exists r4 \exists r5(\\
Role(r2) \wedge \\
Role(r3) \wedge \\
Role(r4) \wedge \\
Role(r5) \wedge \\
Film(f1) \wedge \\
Film(f2) \wedge \\
Film(f3) \wedge \\
r1.OID = f1.FilmID \wedge \\
r2.OID = f2.FilmID \wedge \\
r3.OID = f3.FilmID \wedge \\
r4.OID = r2.OID \wedge \\
r4.Nom = r1.Nom \wedge \\
r4.Prenom = r1.Prenom \wedge \\
r4.Numero = r1.Numero \wedge \\
r5.OID = r3.OID \wedge \\
r5.Nom = r2.Nom \wedge \\
r5.Prenom = r2.Prenom \wedge \\
r5.Numero = r2.Numero \wedge \\
r3.Nom = 'Bruce' \wedge \\
r3.Prenom = 'Willis \wedge \\
r3.Numero = 'NA'\}
\end{aligned}\]
\item Requête 4
\noindent
\[\begin{aligned}
\{e.EpisodeID, e.SID | Episode(e) \wedge \forall a, p (Personne(p) \wedge Role(a) \\
a.Nom = p.Nom \wedge a.Prenom = p.Prenom \wedge p.Numero = a.Numero \wedge \\
p.Genre = "f" \wedge a.OID = e.EpisodeID \}
\end{aligned}\]
\end{list}
\newpage
\section{Site Web}
Le site est divisé en 4 parties principales :
\vskip 3pt
\begin{itemize}
\item La page d’accueil, d'où un utilisateur peut lancer une recherche pour une Œuvre ou des personnes.
\item L'espace administrateur, permettant d'ajouter des oeuvres et personnes à la base de données.
\item La recherche avancée.
\item La page de statistiques, offrant quelques informations intéressantes sur les données stockées dans la base de données.
\end{itemize}
\subsection{L'administrateur}
Lorsqu'un administrateur s'identifie, celui-ci profite de nombreuses options supplémentaires. Outre le fait de posséder le droit d'insertion dans la base données, aussi bien pour une oeuvre qu'une personne, celui-ci peut également complètement modifier les pages du site. En effet, l'interface des pages change lorsque un administrateur est identifié. Cette interface lui permet pour une oeuvre de :
\vskip 3pt
\begin{itemize}
\item Modifier le titre.
\item Modifier la date de sortie (et date de fin si l'oeuvre est une série).
\item Modifier les détails (genres, langues, pays).
\item Modifier (ou ajouter) un résumé.
\item Ajouter et supprimer des rôles.
\item Ajouter et supprimer des directeurs.
\item Ajouter et supprimer des personnes.
\item Supprimer l'oeuvre.
\end{itemize}
\vskip 10pt
Et dans le cadre d'une personne de :
\begin{itemize}
\item Modifier ses rôles.
\item Modifier (ajouter et supprimer) les films dont elle est l’auteur.
\item Modifier (ajouter et supprimer) les films dont elle est le directeur.
\item Supprimer la personne.
\end{itemize}
\subsection{La recherche}
L'utilisateur a la possibilité de rechercher des oeuvres (films, séries, épisodes) et des personnes au travers de notre moteur de recherche. Pour trouver un maximum de résultats le plus rapidement possible (et conserver leur pertinence), nous avons choisi d'utiliser les requêtes \textit{MATCH (...) AGAINST (... IN BOOLEAN MODE)} utilisant des fulltext indexes.
\par
Le contenu de l'input entré par l'utilisateur est d'abord traité pour augmenter la pertinence des résultats en ajoutant des "+" devant chaque mot, cela force tous les mots entrés à se trouver dans le résultat et nous évitons donc un nombre trop important de "matchs".
\par
Aussi, si jamais l'utilisateur entre des mots composés exclusivement d'une seule lettre, par exemple pour rechercher le film \textit{A (2002)}, une simple requête \textit{WHERE = }
sera exécutée pour éviter d'avoir un nombre aberrant de résultats.
\subsection{API}
Nous nous sommes servis de l'api du site www.themoviedb.org pour ajouter du contenu à notre site web. \\
Pour les films ainsi que les séries, nous avons récupéré le poster et une image de fond. Nous avons également pu récupérer les photos des personnes et les trailers des films. Par contre, nous n'avons pas pu certifier la concordance du contenu récupéré avec l'oeuvre ou la personne car l'API utilise un système d'id différent du notre. Il se peut donc que du contenu non cohérent apparaisse dans le cas où 2 oeuvres ont le même titre et la même année de sortie ou lorsque 2 personnes ont le même nom. Les posters sont disponibles pour les films et les séries alors que les trailers sont uniquement disponibles pour les films.
\newpage
\subsection{Statistiques}
La section statistiques permet à l'utilisateur d'obtenir des informations intéressantes sur les données stockées dans la base de données. Ces informations sont illustrées grâce à des graphiques. \\
Dans cette section sont disponibles les informations suivantes :
\vskip 3pt
\begin{itemize}
\item Le proportion acteurs/actrices.
\item La proportion de films/séries/épisodes.
\item Le nombre d'oeuvres par pays (top 30).
\item L'évolution des notes en fonction du temps.
\item L'évolution du nombre de films et séries tournés chaque année.
\end{itemize}
\subsection{Commentaires}
Sur chaque page d'oeuvre, les utilisateurs ont la possibilité de laisser un commentaire et d'évaluer l'oeuvre en question grâce à un système d'étoiles.
\section{Conclusion}
Pour conclure, ce projet nous aura permis de mettre en pratique les éléments vus au cours théorique ainsi que d'approfondir et conforter nos compétences acquises lors des travaux pratiques. Ce projet nous aura également permis d'apprendre à réaliser un site web et a été un excellent moyen pour nous faire découvrir les concepts de base de php et javaScript. C'est, au final, un des projets les plus complets que nous avons dû réaliser car il nécessitait l'utilisation de différentes technologies qui mises ensemble forment un tout.
\end{document}