Modélisation orientée document avec JSON

On souhaite réaliser une base de données orientée documents pour gérer des cours et des étudiants, étant données les informations suivantes :

  • Un cours est décrit par les attributs code, titre, description, crédits et prérequis.

  • Les prérequis sont d'autres cours.

  • Un étudiant est décrit par les attributs nom, prénom, adresse.

  • Les adresses sont composées d'un numéro de rue, d'une rue, d'une ville et d'un code postal.

  • Un étudiant suit plusieurs cours et les cours sont suivis par plusieurs étudiants.

Question

Réaliser le MCD en UML de ce problème.

Question

Proposer un exemple JSON équivalent à ce que l'on aurait fait en relationnel normalisé (sachant que ce type de solution ne sera généralement pas favorisé en BD orientée document).

Indice

Représentation d'un cours par un objet JSON.

1
{
2
"code":"api04",
3
"titre":"DW et NOSQL"
4
...
5
}

Solution

Cours
1
{
2
"code":"api04",
3
"titre":"DW et NOSQL",
4
"description":"......",
5
"credits":4
6
}
Prérequis
1
{
2
code:"api04",
3
requis:"api05"
4
}
Étudiant
1
{
2
"num":1,
3
"nom":"Dupont",
4
"prenom":"Jean"
5
}
Adresse
1
{
2
"etudiant":1,
3
"num":8,
4
"rue":"Gury"
5
}
Suis
1
{
2
"etudiant":1,
3
"cours":"api04"
4
}

Question

Proposer un exemple JSON basé sur l'imbrication.

Quel est le principal défaut de cette solution ?

Est-il toujours possible d'avoir une solution ne reposant que sur l'imbrication ?

Solution

Solution favorisant Cours
1
{
2
"code":"api04",
3
"titre":"DW et NOSQL",
4
"description":"......",
5
"credits":4
6
"prerequis":
7
	[
8
		{
9
		"code":"api05",
10
		"titre":"DW et NOSQL, volume II",
11
		"description":"......",
12
		"credits":4
13
		"prerequis": [...]
14
		},
15
		...
16
	]
17
"etudiants":
18
	[
19
		{
20
		"nom":"Dupont",
21
		"prenom":"Jean",
22
		"adresse": 
23
			{
24
			"num":8,
25
			"rue":"Gury"
26
			}
27
		},
28
		...
29
	]
30
}
Remarque

Il existe une autre solution favorisant Etudiant.

Attention

La principal défaut de cette solution est sa redondance :

  • toutes les données de tous les étudiants sont copiées dans chaque cours ;

  • tous les cours sont copiés à chaque fois qu'ils sont prérequis d'un autre cours.

Fondamental

Si l'on avait un cycle de référence, par exemple deux cours pré-requis l'un de l'autre, alors on aurait nécessairement besoin d'identification et de références.

Question

Proposer un exemple JSON basé sur les références.

Quelles sont les principales différences avec un système relationnel ?

Solution

Cours
1
{
2
"_id":"30ae9e51-f5c8-4022-a68d-3f3948dbdcb1",
3
"code":"api04",
4
"titre":"DW et NOSQL",
5
"description":"......",
6
"credits":4,
7
"prerequis":["a1449020-9b24-44a1-b12d-84ef592f8853","cf936817-19fa-4635-b009-a383c90ab6d7"]
8
}
Étudiant
1
{
2
"_id":"850b1657-a070-4a25-ab63-6f61b436cf9d",
3
"nom":"Dupont",
4
"prenom":"Jean",
5
"cours":["30ae9e51-f5c8-4022-a68d-3f3948dbdcb1","cf936817-19fa-4635-b009-a383c90ab6d7"]
6
}
Adresse
1
{
2
"_id":"7e93be68-7d6e-4506-9be5-ffd78e5afb5d",
3
"etudiant":"850b1657-a070-4a25-ab63-6f61b436cf9d",
4
"num":8,
5
"rue":"Gury"
6
}

Les principales différences avec le relationnel sont :

  • les clés artificielles sont préférées aux clés naturelles ;

  • on utilises des identifiants universels pour les clés artificielles ;

  • on utilise des tableaux de références pour gérer des références multiples (graphes).

Question

Sachant que l'objectif de l'application est de visualiser une liste des étudiants avec les cours que chacun suit, et d'accéder aux détails des cours uniquement lorsque l'on clique sur son code ou son titre.

Proposer une solution adaptée à ce problème mobilisant référence et imbrication.

Solution

Étudiant
1
2
{
3
"nom":"Dupont",
4
"prenom":"Jean",
5
"adresse": 
6
	{
7
	"num":8,
8
	"rue":"Gury"
9
	},
10
"cours":
11
	[
12
	{
13
		"_id":"30ae9e51-f5c8-4022-a68d-3f3948dbdcb1",
14
		"code":"api04",
15
		"titre":"DW et NOSQL"
16
	},
17
	{
18
		"_id":"cf936817-19fa-4635-b009-a383c90ab6d",
19
		"code":"api05",
20
		"titre":"DW et NOSQL, la suite"
21
	}
22
	]
23
}
Cours
1
{
2
"_id":"30ae9e51-f5c8-4022-a68d-3f3948dbdcb1",
3
"code":"api04",
4
"titre":"DW et NOSQL",
5
"description":"......",
6
"credits":4,
7
"prerequis": 
8
	[
9
	{
10
		"_id":"a1449020-9b24-44a1-b12d-84ef592f8853",		
11
		"code":"api03"
12
	}
13
	]
14
}