Skip to content

Commit 33de98a

Browse files
committed
Merge branch 'master' of github.com:BioDataScience-course/BioDataScience2
2 parents 5cca2e0 + 59b940d commit 33de98a

File tree

1 file changed

+328
-9
lines changed

1 file changed

+328
-9
lines changed

inst/tutorials/B09La_db/B09La_db.Rmd

Lines changed: 328 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ author: "Guyliann Engels & Philippe Grosjean"
44
description: "**SDD II Module 9** Bases de données."
55
tutorial:
66
id: "B09La_db"
7-
version: 2.0.0/0
7+
version: 2.0.7/0
88
output:
99
learnr::tutorial:
1010
progressive: true
@@ -13,27 +13,346 @@ runtime: shiny_prerendered
1313
---
1414

1515
```{r setup, include=FALSE}
16-
BioDataScience3::learnr_setup()
16+
BioDataScience2::learnr_setup()
1717
SciViews::R()
18-
library(mlearning)
18+
library(DBI)
19+
library(dm)
1920
20-
# ...
21+
# Données inspirées Benrezkallah 2022
22+
set.seed(11)
23+
24+
station <- dtx(tribble(
25+
~"id_station" , ~"pays", ~"localite", ~"station", ~"coordonnee",
26+
"stat_01", "Belgique", "Mons", "Abbaye Saint Denis", "50.4939°N 4.1893°E",
27+
"stat_02", "Belgique", "Mons", "Parc du bois de Mons", "50.4484°N 3.9906°E",
28+
"stat_03", "Belgique", "Mons", "Jardin Suspendu", "50.4469°N 3.9510°E"
29+
))
30+
31+
individus <- dtx(
32+
id_station = c(rep("stat_01", 568), rep("stat_02", 360), rep("stat_03", 294)),
33+
id_espece = paste0("sp_", 1:1222),
34+
espece = sample(c(rep("Bombus pascorum", 615), rep("Terrestribombus sp", 295), rep("Osmia bicornis", 312))),
35+
experimentateur = sample(c(rep("Benrezkallah",980), rep("Santerre", 242)))
36+
)
37+
38+
bees_species <- individus
39+
bees <- sleft_join(individus, station) %>.%
40+
sselect(., -id_station)
41+
42+
bees_db <- dbConnect(duckdb::duckdb())
43+
dbWriteTable(bees_db, "station", station)
44+
dbWriteTable(bees_db, "species", bees_species)
45+
46+
bees_dm <- dm_from_src(bees_db) %>.%
47+
dm_set_colors(., red = station, orange = species)
48+
bees_dm %>.%
49+
dm_add_pk(., species, id_espece) %>.%
50+
dm_add_pk(., station, id_station) ->
51+
bees_dm1
52+
bees_dm2 <- dm_add_fk(bees_dm1, species, id_station, station)
2153
```
2254

2355
```{r, echo=FALSE}
24-
BioDataScience3::learnr_banner()
56+
BioDataScience2::learnr_banner()
2557
```
2658

2759
```{r, context="server"}
28-
BioDataScience3::learnr_server(input, output, session)
60+
BioDataScience2::learnr_server(input, output, session)
2961
```
3062

3163
------------------------------------------------------------------------
3264

3365
## Objectifs
3466

35-
- ...
67+
Une base de données est un ensemble structuré de données stockées dans un système informatique, avec un accès facile et rapide pour des applications logicielles et des utilisateurs autorisés. Elle peut être considérée comme un grand conteneur **organisé** pour stocker des informations de manière **structurée**.
68+
69+
Parmi les différents types de bases de données, nous allons nous intéresser aux bases de données relationnelles. Une base de données **relationnelle** est une collection de données structurées qui sont organisées en tables qui sont liées entre elles par des relations. Les bases de données relationnelles sont très répandues et utilisées dans de nombreux domaines, notamment dans la gestion des entreprises, les services financiers, l'administration publique et la recherche scientifique. Elles sont conçues pour gérer des quantités massives de données de manière fiable et cohérente. Ce tutoriel vous permettra de :
70+
71+
- créer une base de données
72+
- traiter de la normalisation d'une base de données
73+
- réaliser le schéma d'une base de données
74+
75+
## Base de données et normalisation
76+
77+
Ajouter des tables dans une base de données n'est pas une étape complexe. Si l’on ne s’intéresse pas à la **normalisation **des données, les avantages d’une base de données est très limité., n'est intéressant que si on s'intéresse à la **normalisation** des données. La normalisation des bases de données est un processus qui vise à optimiser la structure des données stockées dans une base de données relationnelle en **évitant la redondance** et en définissant des liens entre les tables. La normalisation va permettre de diminuer la taille d'une base de données, de simplifier les requêtes, et d'optimiser le traitement des requêtes.
78+
79+
Le tableau de données présenté est inspiré des travaux de fin d'études de Benzerkallah [Effet des facteurs pédologiques sur les communautés d'abeilles sauvages dans les potagers de la commune de Mons](http://www.atlashymenoptera.net/biblio/02000/BENREZKALLAH_2022_potager_Mons.pdf) dont voici la citation.
80+
81+
> Benrezkallah J. 2022. Effet des facteurs pédologiques sur les communautés d'abeilles sauvages dans les potagers de la commune de Mons. Mémoire de Master 2 en Sciences biologiques, Université de Mons, Mons, 127 pp.
82+
83+
Cette étude a mené à la collecter de très nombreuses données que le chercheur souhaite gérer sous la forme d'une base de données. Aidez ce dernier dans la gestion de ces données.
84+
85+
Les dix premières lignes sont présentées ci-dessous.
86+
87+
```{r, echo = TRUE}
88+
head(bees, n=10)
89+
```
90+
91+
Les colonnes de ce tableau sont les suivantes :
92+
93+
- id : l'identifiant de l'insecte collecté.
94+
- espece : l'espèce capturée et identifiée
95+
- experimentateur : Le personne ayant collecté et identifié les individus
96+
- pays : Pays de la collecte
97+
- localite : Ville de la collecte
98+
- station : nom de la station
99+
- coordonnee : coordonnées de la station (WGS84)
100+
101+
Explorez le jeu de données `bees` afin de répondre aux questions ci-dessous
102+
103+
```{r explo_noscore, exercise = TRUE}
104+
105+
```
106+
107+
```{r qu_db}
108+
quiz(
109+
question("Est ce que la tableau présenté ci-dessus peut être une table d'un base de données relationnelles ?",
110+
answer("Oui", correct = TRUE),
111+
answer("Non"),
112+
allow_retry = TRUE,
113+
random_answer_order = TRUE,
114+
correct = "Ce tableau correspond bien à un tableau cas par variable. Il est donc possible de l'utiliser dans une base de données. Il n'est cependant pas normalisé."
115+
),
116+
question("Sélectionnez parmi les variables suivantes celles présentant de la redondance optimisable avec la normalisation.",
117+
answer("espece", message = "Plusieurs individus peuvent être de la même espèce. Cette information est crucial dans cette table et ne doit pas être optimisé."),
118+
answer("pays", correct = TRUE, , message = "Il n'est pas utile de répliquer le nom de pays d'une station pour chaque individu collecté."),
119+
answer("coordonnée", correct = TRUE, message = "Il n'est pas utile de répliquer les coordonnées d'une station pour chaque individu collecté."),
120+
answer("id_espece", message = "La varaible id est un identifiant unique pour chaque individus. Cette variable n'est pas redondante."),
121+
allow_retry = TRUE,
122+
random_answer_order = TRUE)
123+
)
124+
```
125+
126+
## Base de données et schéma
127+
128+
Suite à votre exploration de tableau `bees`, vous avez pu observer une certaine redondance dans les données. Deux tables sont réalisées afin de limiter cette redondance. Vous pouvez observer qu'une colonne id_station a été ajoutée.
129+
130+
```{r, echo=TRUE}
131+
head(station)
132+
```
133+
134+
```{r, echo=TRUE}
135+
head(bees_species)
136+
```
137+
138+
Créez une base de données au format duckdb en mémoire et ajoutez vos deux tables que vous nommerez station pour le tableau station et species pour le tableau bees_species.
139+
140+
```{r connect_h2, exercise = TRUE}
141+
# Création de la base de données en mémoire
142+
bees_db <- ___(duckdb::___)
143+
bees_db
144+
# Ajout des tables
145+
___(___, "___", ___)
146+
___(___, "___", ___)
147+
# Noms des tables présentes dans bees_db
148+
dbListTables(bees_db)
149+
```
150+
151+
```{r connect_h2-hint-1}
152+
# Création de la base de données en mémoire
153+
bees_db <- dbConnect(duckdb::___)
154+
bees_db
155+
# Ajout des tables
156+
___(___, "___", ___)
157+
___(___, "___", ___)
158+
# Noms des tables présentes dans bees_db
159+
dbListTables(bees_db)
160+
161+
#### ATTENTION: Hint suivant = solution !####
162+
```
163+
164+
```{r connect_h2-solution}
165+
# Création de la base de données en mémoire
166+
bees_db <- dbConnect(duckdb::duckdb())
167+
bees_db
168+
# Ajout des tables
169+
dbWriteTable(bees_db, "station", station)
170+
dbWriteTable(bees_db, "species", bees_species)
171+
# Noms des tables présentes dans bees_db
172+
dbListTables(bees_db)
173+
174+
#### ATTENTION: Hint suivant = solution !####
175+
```
176+
177+
```{r connect_h2-check}
178+
grade_code("Bien joué ! Tu viens de créer un base de données en mémoire. Ensuite tu as ajouté des tables avec la fonction dbWriteTable(). Deux tables sont présentes dans la base de données bees_db.")
179+
```
180+
181+
Vous avez deux tables au sein de la base de données. Il a présent temps de proposer un schéma et des liens (on parlera de clés) entre vos tables. Vous allez pour ce faire employer le package {dm}.
182+
183+
Créez un objet dm associé à votre base de données (`bees_db`) et nommé le `bees_dm`. Ajoutez ensuite la couleur rouge à la table `station` et la couleur orange à la table `species`. Terminez par visualiser le schéma de la base.
184+
185+
```{r dm, exercise = TRUE}
186+
# Création d'un objet `dm`
187+
bees_dm <- ___(___)
188+
bees_dm
189+
# Ajout d'un couleur pour chaque table
190+
bees_dm <- ___(bees_dm, red = ___, orange = ___)
191+
# Graphique du schéma de la base
192+
___(___, view_type = "all")
193+
```
194+
195+
```{r dm-solution}
196+
# Création d'un objet `dm`
197+
bees_dm <- dm_from_src(bees_db)
198+
bees_dm
199+
# Ajout d'un couleur pour chaque table
200+
bees_dm <- dm_set_colors(bees_dm, red = station, orange = species)
201+
# Graphique du schéma de la base
202+
dm_draw(bees_dm, view_type = "all")
203+
```
204+
205+
```{r dm-check}
206+
grade_code("Vous avez un objet dm. La visualition de l'objet vous permet d'observer vos deux tables. Actuellement, les clés primaires et les clés étrangères n'ont pas encore été définie.")
207+
```
208+
209+
Afin de proposer une base de données avec un niveau de normalisation plus élevé. Définissez une clé primaire pour chaque table.
210+
211+
```{r pk_h2, exercise =TRUE, paged.print=FALSE}
212+
# Clés primaires potentiels
213+
___(___, species)
214+
___(___, ____)
215+
# Ajout des clés primaires
216+
bees_dm %>.%
217+
___(___, ___, ___) %>.%
218+
___(___, ___, ___)->
219+
bees_dm1
220+
bees_dm1
221+
```
222+
223+
```{r pk_h2-hint-1}
224+
# Clés primaires potentiels
225+
dm_enum_pk_candidates(___, species)
226+
___(___, ___)
227+
# Ajout des clés primaires
228+
bees_dm %>.%
229+
dm_add_pk(., ___, ___) %>.%
230+
___(., ___, ___) ->
231+
bees_dm1
232+
bees_dm1
233+
234+
#### ATTENTION: Hint suivant = solution !####
235+
```
236+
237+
```{r pk_h2-solution}
238+
# Clés primaires potentiels
239+
dm_enum_pk_candidates(bees_dm, species)
240+
dm_enum_pk_candidates(bees_dm, station)
241+
# Ajout des clés primaires
242+
bees_dm %>.%
243+
dm_add_pk(., species, id_espece) %>.%
244+
dm_add_pk(., station, id_station) ->
245+
bees_dm1
246+
bees_dm1
247+
```
248+
249+
```{r pk_h2-check}
250+
grade_code("Votre objet bees_dm1 comprend à présent deux clés primaires.")
251+
```
252+
253+
Définissez à présent une clé étrangère entre vos deux tables (species et station) en partant de l'objet `bees_dm1` et visualisez le schéma de la base.
254+
255+
```{r fk, exercise =TRUE, , paged.print=FALSE}
256+
# Clés étrangères potentiels
257+
___(___, ___, ___)
258+
# Ajout de la clé étrangères
259+
bees_dm2 <- ___(___, ___, ___, ___)
260+
# Graphique du schéma de la base
261+
dm_draw(___, view_type = "all")
262+
```
263+
264+
```{r fk-solution}
265+
# Clés étrangères potentiels
266+
dm_enum_fk_candidates(bees_dm1, species, station)
267+
# Ajout de la clé étrangères
268+
bees_dm2 <- dm_add_fk(bees_dm1, species, id_station, station)
269+
# Graphique du schéma de la base
270+
dm_draw(bees_dm2, view_type = "all")
271+
```
272+
273+
```{r fk-check}
274+
grade_code("Votre objet bees_dm2 comprend à présent deux clés primaires et une clé étrangère qui lié vos deux tables. Le graphique vous permet de bien visualiser la structuration de votre base. La visualisation de la base est très intéressante. Cet objet dm permet de réaliser des requêtes très simplement.")
275+
```
36276

37-
## Qu'est-ce qu'une base de données ?
277+
## Requête sur la base de données
38278

39-
TODO: ce tutoriel doit encore être écrit. Vous devez probablement penser à installer une version plus récente du package qui contient les exercices finalisés !
279+
Répondez à la question suivante à l'aide d'un tableau résumé : *Combien d'individus par espèce ont été collectés dans la station"Abbaye Saint Denis" par l'expérimentateur "Benrezkallah »?*
280+
281+
Le schéma de la base de données est proposé afin de vous aider à répondre à cette question.
282+
283+
```{r}
284+
dm_draw(bees_dm2, view_type = "all")
285+
```
286+
287+
```{r request_h2, exercise = TRUE}
288+
# Filtre
289+
bees_dm2 %>.%
290+
___(___, ___, ____) %>.% # filtre sur `station`
291+
___(___, ___, ____) %>.% # filtre sur `species`
292+
___(., ___) -> # combinaison des tableaux
293+
bees_request
294+
# Résumé des données
295+
____ %>.%
296+
___(., ___) %>.%
297+
___(.) ->
298+
request2
299+
300+
# Collecte de la requête
301+
(___ <- collect_dtx(___))
302+
```
303+
304+
```{r request_h2-hint-1}
305+
# Filtre
306+
bees_dm2 %>.%
307+
dm_filter(., station, station == "Abbaye Saint Denis") %>.% # filtre sur `station`
308+
dm_filter(., ___, ___) %>.% # filtre sur `species`
309+
dm_flatten_to_tbl(., species) -> # combinaison des tableaux
310+
bees_request
311+
# Résumé des données par espèce
312+
bees_request %>.%
313+
___(., ___) %>.%
314+
___ ->
315+
request2
316+
317+
# Collecte de la requête
318+
(bee_sum <- collect_dtx(___))
319+
320+
```
321+
322+
```{r request_h2-solution}
323+
# Filtre
324+
bees_dm2 %>.%
325+
dm_filter(., station, station == "Abbaye Saint Denis") %>.% # filtre sur `station`
326+
dm_filter(., species, experimentateur == "Benrezkallah") %>.% # filtre sur `species`
327+
dm_flatten_to_tbl(., species) -> # combinaison des tableaux
328+
bees_request
329+
330+
# Résumé des données
331+
bees_request %>.%
332+
group_by(., espece) %>.%
333+
count(.) ->
334+
request2
335+
336+
# Collecte de la requête
337+
(bee_sum <- collect_dtx(request2))
338+
```
339+
340+
```{r request_h2-check}
341+
grade_code("Parfait ! L'espèce la plus présente est *Bombus pascorum*. La mise en place d'un schéma avec {dm} a permis de réaliser une requête sur deux tables et de les combiner facilement. Vous avez ensuite résumé ces observations. Vous avez réalisé tout cela directement sur votre base de données et sans vous préoccuper de l'écriture de la requête. En effet, avec {dbplyr}, est aussi simple que de la faire sur un tableau de données classique.")
342+
```
343+
344+
## Conclusion
345+
346+
Félicitation ! Vous avez créé une base de données, en limitant la redondance, en définissant des clés primaires et étranges et proposé un schéma clair de la base avec le package {dm}. Vous avez également réalisé une requête multitable avec les fonctions du package {dm} et de {dbplyr}.
347+
348+
Maintenant que vous avez compris les grands principes des bases de données et que vous êtes capable d'écrire le code permettant de réaliser une requête, vous pouvez appliquer cette technique par vous-même.
349+
350+
```{r comm_noscore, echo=FALSE}
351+
question_text(
352+
"Laissez-nous vos impressions sur cet outil pédagogique",
353+
answer("", TRUE, message = "Pas de commentaires... C'est bien aussi."),
354+
incorrect = "Vos commentaires sont enregistrés.",
355+
placeholder = "Entrez vos commentaires ici...",
356+
allow_retry = TRUE
357+
)
358+
```

0 commit comments

Comments
 (0)