Architecture SQL, faire des favoris

Résolu/Fermé
Yuh12 Messages postés 184 Date d'inscription mercredi 7 mai 2014 Statut Membre Dernière intervention 28 septembre 2017 - 7 mai 2014 à 06:47
Yuh12 Messages postés 184 Date d'inscription mercredi 7 mai 2014 Statut Membre Dernière intervention 28 septembre 2017 - 8 mai 2014 à 17:43
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 mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 1 339
Modifié par mpmp93 le 7/05/2014 à 07:42
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 mercredi 7 mai 2014 Statut Membre Dernière intervention 28 septembre 2017 24
7 mai 2014 à 09:21
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 mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 1 339
7 mai 2014 à 10:04
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 mercredi 7 mai 2014 Statut Membre Dernière intervention 28 septembre 2017 24
8 mai 2014 à 17:43
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