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.

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

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).

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

{
"code":"api04",
"titre":"DW et NOSQL"
...
}

Cours

{
"code":"api04",
"titre":"DW et NOSQL",
"description":"......",
"credits":4
}

Prérequis

{
code:"api04",
requis:"api05"
}

Étudiant

{
"num":1,
"nom":"Dupont",
"prenom":"Jean"
}

Adresse

{
"etudiant":1,
"num":8,
"rue":"Gury"
}

Suis

{
"etudiant":1,
"cours":"api04"
}

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 favorisant Cours

{
"code":"api04",
"titre":"DW et NOSQL",
"description":"......",
"credits":4
"prerequis":
	[
		{
		"code":"api05",
		"titre":"DW et NOSQL, volume II",
		"description":"......",
		"credits":4
		"prerequis": [...]
		},
		...
	]
"etudiants":
	[
		{
		"nom":"Dupont",
		"prenom":"Jean",
		"adresse": 
			{
			"num":8,
			"rue":"Gury"
			}
		},
		...
	]
}

Il existe une autre solution favorisant Etudiant.

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.

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.

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

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

Cours

{
"_id":"30ae9e51-f5c8-4022-a68d-3f3948dbdcb1",
"code":"api04",
"titre":"DW et NOSQL",
"description":"......",
"credits":4,
"prerequis":["a1449020-9b24-44a1-b12d-84ef592f8853","cf936817-19fa-4635-b009-a383c90ab6d7"]
}

Étudiant

{
"_id":"850b1657-a070-4a25-ab63-6f61b436cf9d",
"nom":"Dupont",
"prenom":"Jean",
"cours":["30ae9e51-f5c8-4022-a68d-3f3948dbdcb1","cf936817-19fa-4635-b009-a383c90ab6d7"]
}

Adresse

{
"_id":"7e93be68-7d6e-4506-9be5-ffd78e5afb5d",
"etudiant":"850b1657-a070-4a25-ab63-6f61b436cf9d",
"num":8,
"rue":"Gury"
}

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).

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.

Étudiant

{
"nom":"Dupont",
"prenom":"Jean",
"adresse": 
	{
	"num":8,
	"rue":"Gury"
	},
"cours":
	[
	{
		"_id":"30ae9e51-f5c8-4022-a68d-3f3948dbdcb1",
		"code":"api04",
		"titre":"DW et NOSQL"
	},
	{
		"_id":"cf936817-19fa-4635-b009-a383c90ab6d",
		"code":"api05",
		"titre":"DW et NOSQL, la suite"
	}
	]
}

Cours

{
"_id":"30ae9e51-f5c8-4022-a68d-3f3948dbdcb1",
"code":"api04",
"titre":"DW et NOSQL",
"description":"......",
"credits":4,
"prerequis": 
	[
	{
		"_id":"a1449020-9b24-44a1-b12d-84ef592f8853",		
		"code":"api03"
	}
	]
}
AccueilIntroduction aux bases de données non-relationnelles > Exercice > Exercice : Modélisation orientée document avec JSON< PrécédentSuivant >