IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Optimisation objet serialisé


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Par défaut Optimisation objet serialisé
    Bonjour,
    J'ai une appli php qui permet d'affectier une action a plusieurs utilisateurs, et aujourd'hui je stocke les id de ces users (issue d'un select multiple) de facon sérialisé, dans un champ texte d'une table mysql, ex:
    a:3:{i:1;s:2:"89";i:2;s:3:"150";i:3;s:3:"128";}

    Pour afficher les actions d'un user je fait donc ma requete pour recuperer toutes les actions de la table:
    select meschamps from tableactions where status <>'closed'
    et aprés je verifie si mon user est dans la liste des responsables de cette action par cette methode:
    while (list($Resp, $Level, ...) = mysql_fetch_row($result)) {
    $responsables = unserialize($Resp);
    //var_dump($responsables);
    if (in_array($userid, $responsables))
    {
    $t++;
    }


    C'est un peu lourd, mais honnement je ne vois pas comment faire autrement.
    J'ai essayé de stocker non pas les id des users, mais les noms séparés par des virgules, mais c'est pas mieux...
    Aprés avoir un lu les differents post mon probleme vient du fait que j'ai serialisé ma liste de users c'est bien ca? Il n'est pas possible de faire une recherche SQL sur un objet serialisé, je me trompe?

    Alors comment faire pour stocker une liste et pouvoir faire une requete facilement dessus? je voudrais eviter d'avoir a creer une autre table...
    Il y a t-il une methode miracle??

    Merci pour vos conseils.
    A+
    VooDoo

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Par défaut
    Dans ta table tableactions tu peux rajouter un champs user_id qui est une Cle etrangere (FK USER(id)) vers l'id de la table utilisateur.


    Qand tu veux connaitre les action d'un utilisateur (dont tu as l'id) tu fais qqch comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      SELECT meschamps 
         FROM tableactions
      WHERE status <> 'closed 
           AND  id = "$id_user"
    C'est rapide et propre. Souvent ca ne sert a rien de vouloir faire mieux que la base de donnees dans ton code .... Elle est faite pour ca, trouver la facon la plus rapide de rappartrier tes inforamtions.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Par défaut
    si j'ai bien compris, ce champ comportera qu'un seul id non?
    mon probleme etant de stocker plusieurs id pour une meme action...

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Par défaut
    Oui le champs ne contiendra qu'un seul id, mais ce n'est pas un probleme

    Par exemple

    Table ACTION
    ---------------------
    nom_action | utilisateur_id
    ------------------------------------
    ajouter | 1
    modifier | 1
    supprimer | 1
    ajouter | 2
    ajouter | 3
    modifier | 3

    Avec la requete que je t'ai donnee tout precedement en cherchant pour l'utilisateur 1 tu sauras qu'il a les actions : Ajouter, modifier, supprimer
    Que l'utilisateur 2 a l'action ajouter
    Que l'utilisateur 3 a les actions ajouter et modifier

    C'est une solution plus generique et + normalisee a ton probleme.

    (Si tu veux avoir une souplesse maximale il faudrait avoir 3 tables Utilisateurs, Actions, et Droits. Droits contiendrait l'id d'un utilisateur et l'id d'une action. Les actions ne seraient alors que un id, un nom d'action et une description de l'action par exemple.)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Par défaut
    ok, on s'est mal compris pardon.
    ma table action n'est pas une table de droits, celle la je l'ai deja car j'utilise les bases d'un CMS.
    mon appli action liste toute les actions que doivent faire les gens de mon entreprise, par exemple:
    Aid|action|resp
    6300, modifier la procedure S-300 pour eviter ne renouveler le probleme cité,a:3:{i:1;s:2:"89";i:2;s:3:"150";i:3;s:3:"128";}

    et la clef de cette table est le n° de l'action Aid, et l'action ne peu pas répété pour chaque user...

    Est-ce plus clair?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Par défaut
    Oui c'est tres clair, je pense que j'avais bien compris ton probleme et
    que mon explication etait tout a fait pertinente, et adequate dans ton cas.

    Aussi vais re-expliquer autrement car je pense que ca vaut vraimment la peine.
    Dans une situation pareil, si tu connais un peu de theorie de BD rellationnel,
    en derniere forme normale tu aurais 3 tables (Utilisateurs, Actions, et Droits).

    La theorie des BD relationnels aide a creer des BD clair, simple et souple d'utilisations (entre autre). Si tu soumets ton probleme a 5 informaticiens qui connaissent les theories
    de BD relationnels ils vont probablement tous +- arriver a cette meme solution.

    Immagine que tu aies une autre table Droit (peut importe son nom en verite) qui contiendrait
    (id_utilisateur, id_action). Et que quand un utilisateur a le droit de faire une certaine action, tu introduise l'id de l'utilisateur et l'id de l'action dans cette table ?

    Et bien grace a cette table tu serais capable pour n'importe qu'elle utilisateur de dire toutes les actions qu'il peut faire. Il pourait faire zero ou toutes les actions.

    (Accessoirement tu pourais aussi trouver tous les utilisateurs qui on le droit de faire tel
    ou tel action).

    Voila, je t'invite a lire un tutoriel sur le SQL et sur les jointures, jointures internes et jointures externes. Cela te permettra de simplifier tes applications et tes schemas de BD tout en y gagnant aussi en performance.

Discussions similaires

  1. Encodage d'objet serialisé pour passer par une requete HTTP
    Par CocoLeNain dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 03/06/2010, 17h32
  2. [Applet]Transfert d'objet serialisé applet/servlet
    Par fanou28 dans le forum Applets
    Réponses: 7
    Dernier message: 22/02/2010, 21h45
  3. Envoi par fichier ou objet serialisé ?
    Par rimas2009 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 15/07/2009, 18h19
  4. Objet serialisé en java
    Par alexorcet dans le forum Général Java
    Réponses: 4
    Dernier message: 19/05/2008, 11h25
  5. [Débutant(e)][optimisation]Objet Session
    Par plddcn dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 24/01/2005, 21h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo