• 12 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 26/09/2024

Créez le modèle de données

Maintenant que votre projet est créé et que la bibliothèque Room a été importée dans celui-ci, il est possible de passer aux premières étapes de l’implémentation de la base de données. Mais avant de plonger tête baissée dans le code en écrivant les classes, une phase d’analyse est nécessaire.

Analysez votre besoin

Nous n’allons pas implémenter l’ensemble des fonctionnalités proposées par l’application PETiSoin. Nous allons nous concentrer sur une partie précise de celle-ci : la persistance des animaux et des notes associées.

Avant d’écrire du code, il est important de prendre le temps d’analyser toutes les données que l’application doit persister. Il est aussi essentiel de penser à la façon dont ces données seront stockées dans une base de données relationnelle. Pour nous aider dans cette analyse, nous allons procéder à la réalisation d’un modèle physique de données (MPD), à l’aide du logiciel MySQL Workbench, que nous pourrons ensuite traduire en code Java et Kotlin.

Identifiez les tables de la base de données

La première étape de notre analyse est d’identifier les tables qui composeront la base de données. Cela va nous permettre de répondre au besoin fonctionnel qui est de persister des animaux et des notes associées.

Nous allons donc avoir besoin de deux tables : une pour stocker les animaux et une pour stocker les notes.

Capture d’écran de la première table qui est intitulée Animal et de la seconde table qui est intitulée Note.
Les tables pour stocker les animaux et les notes

Listez les attributs des tables de la base de données

Maintenant que les tables sont définies, il convient de se pencher sur les attributs qui les composent.

L’objectif étant pédagogique, il n’est pas nécessaire ici d’être exhaustif et de tenter de couvrir l’ensemble des attributs permettant de caractériser un animal. Aussi, nous allons rester simples et nous limiter aux caractéristiques suivantes.

Nom

Type

Commentaire

Identifiant unique

Nombre entier

Il s’approche de la notion de tatouage de l’animal. Il s’agit de la clé primaire.

Type

Chaînes de caractères

Il y a trois possibilités : chien, chat et lapin.

Nom

Chaînes caractères

Il n’est pas obligatoirement renseigné si l’animal n’a pas encore de nom.

Taille

Nombre entier

Elle se mesure en centimètres.

Poids

Nombre entier

Il se mesure en grammes.

Âge

Nombre entier

Il se mesure en années.

Pays

Chaînes de caractères

C’est le lieu de résidence de l’animal.

Ville

Chaînes de caractères

C’est le lieu de résidence de l’animal

Numéro et nom de la rue

Chaînes de caractères

C’est le lieu de résidence de l’animal

Réalisez le modèle physique de données de chaque table

À partir de ce tableau, il est alors possible de compléter le MDP.

Capture d'écran montrant l’évolution de la table Animal. La table Animal affiche des champs comme 'id' INT, 'type VARCHAR(45), 'name VARCHAR(45)’, 'height  INT’, 'weight INT’ et 'address VARCHAR(45)’. La table Note est vide.
Le MPD de l’application PETiSoin pour l’animal

Le même exercice est à réaliser pour une note.

Nom

Type

Commentaire

Identifiant unique

Nombre entier

Il s’agit de la clé primaire.

Titre

Chaîne de caractères

 

Contenu

Chaîne de caractères

 

Date de création

Nombre entier

Timestamp (c’est le nombre de millisecondes écoulées depuis le 1er janvier 1970).

Il est alors possible de compléter le MPD.

Capture d'écran montrant l’évolution de la table Note. Elle affiche des champs : 'id INT’, 'title VARCHAR(45)’, 'description LONGTEXT’, et 'creationDate INT’. Un lien 'Indexes' est aussi présent en bas du menu 'Note'.
Le MPD de l’application PETiSoin pour l’animal et la note associée

Finalisez le MPD en identifiant les liens entre les tables

Pour terminer le MPD, il faut déterminer la relation qui existe entre ces deux tables. Dans le cas de notre fonctionnalité, plusieurs notes peuvent être associées à un animal mais une note ne peut être associée qu’à un unique animal. Il s’agit donc d’une relation 1:n.

Voici alors le MDP final.

Capture d’écran qui montre l’intégralité des tables complétées Animal et Notes. Une flèche montre le lien entre les deux tables indiquant une relation 1:n.
Le MPD final de l’application PETiSoin

Vous remarquerez que la modélisation du lien entre les deux tables se modélise par l’attribut  Animal_id. Il s’agit d’une clé étrangère qui référence la clé primaire de l’animal. C’est ce qu’on appelle une contrainte d’intégrité référentielle.

Écrivez vos premières classes

Maintenant que le MPD a été réalisé, vous allez pouvoir le traduire en code grâce à l’utilisation des classes. Dans un premier temps, transposez simplement le MPD en code en écrivant deux classes reprenant les attributs des deux tables de la base de données. Si vous ne savez pas où mettre ces classes dans votre projet, vous pouvez les placer dans un package “database.model”.

Si vous utilisez Java :                                            

Si vous utilisez Kotlin :                              

public final class Animal
{
  public final int id;
  public final String type;
  public final String name;
  public final int height;
  public final int weight;
  public final int age;
  public final String country;
  public final String city;
  public final String address;
  public Animal(int id, String type, 
  String name, 
  int height, int weight, 
  int age, 
  String country, String city, 
  String address)
  {
    this.id = id;
    this.type = type;
    this.name = name;
    this.height = height;
    this.weight = weight;
    this.age = age;
    this.country = country;
    this.city = city;
    this.address = address;
  }
}
public final class Note
{
  public final int id;
  public final String title;
  public final String description;
  public final long creationDate;
  public final int animalId;
  public Note(int id, String title, 
  String description, 
  long creationDate, 
  int animalId)
  {
    this.id = id;
    this.title = title;
    this.description = description;
    this.creationDate = creationDate;
    this.animalId = animalId;
  }
}

 

data class Animal(
  val id: Int = 0,
  val type: String = "",
  val name: String? = null,
  val height: Int = 0,
  val weight: Int = 0,
  val age: Int = 0,
  val country: String = "",
  val city: String = "",
  val address: String = ""
)

data class Note(
  val id: Int = 0,
  val title: String = "",
  val content: String = "",
  val creationDate: Long = 0L,
  val animalId: Int = 0
)

Cependant, en termes de programmation orientée objet, ce code présente un défaut. En effet, tous les éléments qui composent le lieu de résidence de l’animal sont directement portés par la classeAnimal. Il serait plus approprié de créer une nouvelle classe appeléeAddress pour gérer ces informations.

Si vous utilisez Java :

Si vous utilisez Kotlin :

public final class Animal
{
  public final int id;
  public final String type;
  public final String name;
  public final int height;
  public final int weight;
  public final int age;
  public final Address address;
  public Animal(int id, String type, 
  String name, int height, 
  int weight, int age, Address address)
  {
    this.id = id;
    this.type = type;
    this.name = name;
    this.height = height;
    this.weight = weight;
    this.age = age;
    this.address = address;
  }
}
public final class Address
{
  public final String country;
  public final String city;
  public final String address;
  public Address(String country, 
  String city, 
  String address)
  {
    this.country = country;
    this.city = city;
    this.address = address;
  }
}
data class Animal(
  val id: Int = 0,
  val type: String = "",
  val name: String? = null,
  val height: Int = 0,
  val weight: Int = 0,
  val age: Int = 0,
  val address: Address = Address()
)
data class Address(
  val country: String = "",
  val city: String = "",
  val address: String = ""
)

Voici une vidéo qui récapitule les principales étapes pour écrire les classes.

À vous de jouer !

Contexte

Vous devez poser les premières lignes de code pour implémenter la rubrique “Santé” de l’application PETiSoin. Vous allez commencer par écrire le modèle de données.

Dans le projet, disponible sur GitHub (Java ou Kotlin), une première classeAnimala déjà été créée mais ce n’est pas suffisant pour permettre le bon fonctionnement de la rubrique “Santé” de l’application.

Consignes

Dans lepackage com.openclassRooms.Room.data.entity, ajoutez la classe Vaccinequi permet d’associer un vaccin à un animal.

Livrables

Vous pouvez dupliquer le projet GitHub pour modifier le code source du projet et fournir un projet qui compile.

En résumé

  • Le logiciel MySQL Workbench permet de créer un modèle physique de données (MPD).

  • Chaque table de la base de données doit avoir une clé primaire.

  • Pour faire le lien entre deux tables de la base de données, une clé étrangère doit être utilisée.

  • Une contrainte d’intégrité référentielle stipule que chaque valeur de clé étrangère dans une table doit correspondre à une valeur existante de clé primaire dans une autre table référencée.

Vous avez structuré votre modèle de données en identifiant des classes. Vous allez maintenant aller un peu plus loin en transformant ces classes en entités grâce aux différentes annotations de Room.

Exemple de certificat de réussite
Exemple de certificat de réussite