Lier deux objets en DB (id on JSON)

Quelle est la bonne pratique ?

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Je suis actuellement en train de créer une base de données, contenant pas mal d'objets de toutes sortes. Certains d'entres eux contiennent d'autres objets, voire des listes d'autres objets. Je me demandais quelle était la bonne pratique pour modéliser cette liaison ?

1- avoir une colonne contenant l'ID de l'objet lié, avec le principe de clé étrangère tout ça… (Ce que j'ai commencé à faire actuellement mais qui me bloque pour les listes)

2- Parser l'objet en JSON et insérer le tout dans une colonne de type String.

Merci d'avance !

Édité par RedTheTweet

+0 -0
Staff

avoir une colonne contenant l'ID de l'objet lié, avec le principe de clé étrangère tout ça… (Ce que j'ai commencé à faire actuellement mais qui me bloque pour les listes)

c'est dans la table qui contient la liste qu'il faut mettre l'id.

Prenons un exemple simple à comprendre un article avec ses commentaires

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class Article{
public int ID;
public String Title;
public String Text;
public List<Commentaire>;
/*les setters et getters*/
}

public class Commentaire{
public int ID;
public String Text;
public String Author;
public int ID_Article;
/*les setters et getters*/
}

public class ArticleDAO{
    /*tout un blabla*/
    public get_article_with_commentaire_by_id(int id){
          Cursor c = faire_larequete("SELECT a.ID, a.Title, a.Text, c.Text, c.Author, c.ID FROM article_table a, commentaire_table c WHERE a.ID = c.ID_article");
          List<Comment> list = new List<Comment>();
          Article a = new Article();
          while(c.Next()){
               a.setId(c.getInt(1));
               a.setTitle(c.getString(2));
               a.setText(c.getString(3));
               Comment c = new Comment();
               c.setText(c.getStrign(4));
               // flème
               list.add(c);
          }
          a.setCommentList(list);
    } 

Bref un truc dans le genre

Désolé pour le java qui tire un peu sur le C# :( }

+1 -0
Auteur du sujet

Hmmm, j'ai un peu du mal à saisir, on peut faire un exemple ? Si j'ai deux tables

Table représentant l'objet A :

  • ID
  • List<B> (??)

Table représentant l'objet B :

  • ID
  • String

Lorsque je fais mon CREATE TABLE, qu'est ce que je dois spécifié pour la table A ? Uniquement son ID ?

Édité par RedTheTweet

+0 -0
Staff

Question idiote : C'est quoi ton modèle de données ? Car là sans plus d'infos ont pourrait simplement penser que une base de donnée n'est peut être juste pas adapté à ton cas.

Sinon pour simplifier grandement les requêtes et manipuler plus facilement les objets, tu peux utiliser un ORM. Le plus connu en Python est probablement SQL Alchemy mais il y en a d'autres…

+0 -0
Auteur du sujet

J'ai 4 classes principales, l'UML ressemble à ça :

Mark :

  • label : String
  • category : Category
  • scores : List<Score>

Category :

  • label : String
  • criteria: List<Criterion>

Criterion :

  • label : String

Score :

  • value : Float
  • criterion : Criterion

Merci pour le lien, je ne connaissais pas, je vais y jeter un coup d'oeil.

@Artagis , si je comprends bien, avec le modèle si dessus, ma DB devrait plutôt ressembler à ça alors :

Mark:

  • label
  • id_category

Category :

  • label

Criterion :

  • label
  • id_category

Score :

  • value
  • id_criterion
  • id_mark

Par contre si je ne change pas mon modèle derrière, comment je pourrais ajouter à ma DB mon objet Criterion par exemple? Son modèle contient uniquement son label, pas Category :/ Est-ce que ma classe ScoreDAO devra contenir une méthode de ce style ?

1
2
3
4
5
6
7
8
9
public class CriterionDAO {

    public Criterion createCriterion(Criterion criterion, Category category) {
        ContentValues values = new ContentValues();
        values.put(DatabaseHelper.CRITERIA_LABEL, criterion.getLabel());
        values.put(DatabaseHelper.CATEGORY_ID, category.getId());
        // etc...
    }
}

ou plutôt un truc du style ?

1
2
3
4
5
6
7
8
9
public class CriterionDAO {

    public Criterion createCriterion(Criterion criterion) {
        ContentValues values = new ContentValues();
        values.put(DatabaseHelper.CRITERIA_LABEL, criterion.getLabel());
        values.put(DatabaseHelper.CATEGORY_ID, DatabaseHelper.getCategoryByCriterionLabel(criterion.getLabel());
        // impossible de faire une recherche par ID car rien n'a encore été inséré :/
    }
}

Édité par RedTheTweet

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte