Architecture SQL, faire des favoris

Résolu
Yuh12 Messages postés 184 Date d'inscription   Statut Membre Dernière intervention   -  
Yuh12 Messages postés 184 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour gentes gens,

Petit problème d'architecture SQL, en terme de ressources :)

Je possède
- une table Utilisateur.
- une table Media.

J'aimerais qu'un Utilisateur puisse ajouter un Media en favoris.

La solution serait donc de faire une table Favoris avec
- un id
- une clé étrangère pour l'id Utilisateur
- une clé étrangère pour l'id Média

Ainsi j'aurais un tableau du style
id_favoris user_id media_id
1 2 17
2 2 32
3 2 12
4 17 3
5 17 13
6 17 12

Ainsi l'utilisateur n°2 a ajouté en favoris les médias 17,32 et 12.
Et l'utilisateur n°17 a ajouté les médias 3,13 et 12.

Une autre solution serait de faire une colonne supplémentaire "Favoris" dans la table Utilisateur.
Ainsi nous aurions dans la table Utilisateur :

id_utilisateur nom favoris
1 Machin 17,32,12,248,56
2 Bidule 2,16
3 Chouette 46,29,323,102


Ce qui me parait être un autre moyen correct. Maintenant ma question, imaginons que l'on ait 1000 utilisateurs et 8000 Médias, quelle serait la solution la plus efficace en terme de ressources?

Dans le premier cas ma table risque de faire un nombre monstrueux de lignes...
Dans le deuxième cas la colonne "favoris" de ma table Utilisateur va s'incrémenter à l'infini, est ce que ma BDD supporterais une ligne avec 100 favoris?
Y aurait-il une autre solution à laquelle je n'aurais pas songé?

Merci d'avance et bonne journée à tous !
A voir également:

2 réponses

mpmp93 Messages postés 6648 Date d'inscription   Statut Membre Dernière intervention   1 340
 
Bonjour,

L'autre solution est de mettre dans la table utilisateurs un champ supplémentaire favoris de type longtext. Ainsi vous n'avez pas besoin de créer et gérer votre table supplémentaire.

Dans ce champ favoris, vous mettez la sérialisation des favoris, exemple:

$favoris = array(17,27,32);


et plus loin dans le SQL:

$sql = "UPDATE utilisateurs SET favoris='".serialize($favoris)."'" WHERE id=xxx"


xxx étant l'id de l'utilisateur

Pour le rajout ou suppression d'un favori:

$favoris = unserialize($champFavori);

$favoris[] = 44;  // rajoute le favori 44


pour la suppression d'un favori, passer par une boucle foreach:

$aSupprimer = 27; // valeur à supprimer
foreach ($favoris AS $key => $val)
    if ($val == $aSupprimer) {
        unset($favoris[$key])
    }
}


et vous réenregistrez avec SQL

Avec cette solution, pas besoin de table supplémentaire, ni de jointure et tout le bastringue

A+


public function meilleurProgrammeurDuMonde() { return "MOI"; } // humour
1
Yuh12 Messages postés 184 Date d'inscription   Statut Membre Dernière intervention   24
 
Donc à partir de ma deuxième proposition, un longtext suffirait pour stocker les favoris? Même si un utilisateur met plus de 100 médias en favoris, en terme de ressources il n'y aura pas de problème?

Merci beaucoup pour ces conseils en tout cas !!!
0
mpmp93 Messages postés 6648 Date d'inscription   Statut Membre Dernière intervention   1 340
 
la sérialisation d'un ARRAY ne contenant que des valeurs numériques prendra en fait très peu de place. Un longtext prend la place en BDD en fonction de son contenu. Un longtext contenant un array sérialisé de 100 valeurs fera moins de 1Ko, une paille en somme. En tout cas beaucoup moins que votre première solution. De plus, vous n'aurez pas besoin de jointures entre tables vu que pour chaque utilisateur on a directement ses favoris associés à sa fiche.
0
Yuh12 Messages postés 184 Date d'inscription   Statut Membre Dernière intervention   24
 
Génial je vais tester tout ça, je ne connaissais pas du tout le serialize.
Je marque ce sujet comme résolu du coup, merci beaucoup pour votre aide :) !
0