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.
{
"code":"api04",
"titre":"DW et NOSQL"
}
Solution
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"
}
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
{
"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"
}
},
]
}
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
{
"_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).
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
{
"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"
}
]
}