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 :

[CONCEPTION] Base de données forum


Sujet :

PHP & Base de données

  1. #1
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut [CONCEPTION] Base de données forum
    Bonjour,

    désolé si mon post ne concerne pas vraiment php, mais c'est plus une question de réflexion que de code...

    Alors voilà, je compte m'entrainer à faire un forum avec Zend afin de m'entrainer avec les acl, les layout etc...Passons, le problème ne vient pas de là.

    Mon soucis vient de la modélisation de ma base concernant ma future table posts. Comment faire pour créer un système peu couteux en place afin de gérer pour un utilisateur les messages lu ou non lus ? Dans l'idéal, je souhaiterais concevoir mon forum sous cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    catégorie_1
       |_sous_catégorie_1
          |_sujet_1
          |_...
          |_sujet_n
       |_...
       |_sous_catégorie_n
          |_sujet_1
          |_...
          |_sujet_n
    ...
    catégorie_n
    Mon problème est de savoir si l'utilisateur a vu tous les sujets de la sous_catégorie_1 pour afficher l'icone "aucun nouveau message" ou l'icone "nouveau message" en face de la sous_categorie_1. Idem avec la catégorie_1 concernant tous les sujets des sous_categories...

    Bref, je pourrais faire une sorte de produit carthésien associant chaque nouveau message à chaque utilisateur mais bon c'est pas vraiment un système optimisé : si j'ai 1000 forumeurs et 100000 messages j'ai donc 100 000 000 enregistrements en table

    Ou alors faire l'inverse, stocker en table seulement les références des messages lus pour chaque forumeur et ainsi trouver s'il a lu tel ou tel message ?

    Bref, comment faire pour créer un système performant et peu couteux en place ? Par exemple sur le forum developpez, les messages apparaissent en gras ou non selon qu'ils ont été lus ou non.

    Qui a déjà été confronté à cette réflexion ?

  2. #2
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Les messages lus ne seraient ils pas stockés dans la session plutôt que dans la Bdd ?

    Pour ce forum par exemple, c'est mis en gras (donc conservé en mémoire) même si on n'est pas identifié, ce n'est donc pas dans une Bdd.
    Mais peut être ici, quand on est pas identifié, que c'est juste du CSS (a:active{en gras}).

    Mais rien empêche de les stocker dans une BDD, et le 2ème cas me semble mieux.
    Mais de là à pousser les vérifs pour dire si toute une catégorie a été lue (voir toutes), ça risque d'être gourmand.
    Est-ce réellement important comme info ?


    Mais jusqu'à quand compte tu conserver cet historique ?
    Théoriquement c'est valable pour 1 seul jour, non ?
    (d'où l'idée de les mettre en session, ce qui serait nettement plus léger à mon sens).
    Souhaite tu conserver plusieurs jours ?

  3. #3
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    En fait je me base sur l'aspect de différents "provider de forum" si je puis dire comme http://www.forumpersos.com/ où j'avais crée un forum dans le temps (http://skynet-uni66.forumperso.com) qui conservait un historique sans contrainte de temps (ou de pc via les sessions).

    Dans ce forum, comportant plusieurs catégories, sous catégories etc...il existait une icone spécifique pour chaque catégorie de l'arborescence sachant si tous les messages de ladite catégorie avaient été lus ou non.

    Ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    catégorie_1 (-> icone "nouveau message")
       |_sous_catégorie_1 (-> icone "nouveau message")
          |_sujet_1 (lu)
          |_sujet_2 (lu)
          |_sujet_3 (pas lu)
       |_sous_catégorie_2 (-> icone "pas de nouveau message")
          |_sujet_1 (lu)
          |_sujet_2 (lu)
          |_sujet_3 (lu)
    Dans l'exemple, seule la sous catégorie 2 a une icone "pas de nouveau message" car elle n'a pas de sujet non lu (recursivement).

    je souhaiterais donc mettre en place d'une facon élégante et peu gourmande un tel système sachant que le cas d'un utilisateur non connecté affichera quoi qu'il arrive que des icones "pas de nouveau message" (épicétou )

    Effectivement de prime abord, cela semble être gourmand, mais il doit y avoir une solution car sur mon ancien forum avant de faire un RAZ, j'avais 100k messages et quelque chose comme 600-700 membres...d'autant plus que mon forum est un forum parmi tous ceux qui sont gérés par forumperso.


    Citation Envoyé par RunCodePhp Voir le message
    Souhaite tu conserver plusieurs jours ?
    Oui sans durée de temps. Après y avoir réfléchi (en mangeant mes frites ce midi) je pensais mettre en base (sérialisation de tableau ou un enregistrement par post lu) concernant chaque post lu par forumeur. Un message serait considéré comme non lu ssi il ne se trouve pas dans cette table et si la date du dernier message remonte à moins d'une semaine par exemple. En faisant ainsi, je pense que ca allège quelque peu le traitement et surtout nécessite moins d'enregistrements en base

    EDIT: après avoir supprimer sous firefox mes sessions, cookies etc, je conserve le système des messages en gras ou non selon que j'ai lu ou non les messages sur le forum developpez donc je dirai qu'à priori c'est pas géré par les sessions

  4. #4
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Franchement j'en sais rien, j'ai jamais géré autant de données.
    En tout cas, j'étais de penser que tu comptais conserver ça sans limitation de temps.
    Ca change tout.

    Si on se tient à une conception stricte, il faudrait une table genre "message_visited" avec les couples "message_id" et "user_id" et une date.
    Si je ne dis pas de bêtises.


    C'est vrai qu'il est tentant de créer uniquement un champ du coté de la table user genre "message_visited" en sérialisant les données.
    Mais c'est le genre de truc qui m'a rarement inspiré, car souvent c'est le code Php qui trinque (ça ne veut pas dire que je ne le fais pas).


    Mais est ce qui 'il pas moyen de conserver la conception stricte mais de créer une vue qui ne sélectionnerait que les messages de la date limite que tu t'es fixé : 1 semaine.
    Cette vue sera théoriquement pas si lourde que ça, non ?

    Peut être aussi ne pas mettre la table "message_visited" dans la BDD du forum, mais une autre Bdd ???


    C'est vraiment des idées comme ça.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 10
    Par défaut
    Bonjour, je me permet de remonter ce message parce que je suis actuellement entrain de faire la conception d'un forum et je suis entrain de réfléchir sur le même problème, et je me tire les cheveux .... j'aimerai bien savoir si tu as trouver une solutions ......

  6. #6
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Yep j'ai mis en stand by

    C'était plus un "test" pour m'entrainer avec Zend qu'autre chose...

    Dans l'absolu, je pense qu'il te faut coupler une bdd avec les sessions. A la connexion, tout les messages apparaissent non lus s'ils sont datés > à la date de dernière activité (qui correspond sur le moment à la dernière connexion active) mais inférieurs à 1 semaine par exemple (pas la peine de déterrer les posts d'un an...). En session, tu stockes les id de ces messages ainsi que les id des categories parentes sous forme de md5 (explicité plus bas).

    Lorsque l'utilisateur va voir un message, tu vires de la session eventuellement la parentée du message dans une session sous forme de md5('1-5-22') correspondant à la catégorie parente 1, sous categ 5 message id 22 ou si tu crains les doublons md5('c1-sc5-mid22') le tout étant d'avoir un md5 unique qui puisse permettre de savoir quels messages il a lu. Tu mets à jour aussi le champs de dernière activité.

    Ensuite c'est plus une question d'algo qu'autre chose, à priori tu as tout ce qu'il faut pour gérer ton soucis. Désolé pour l'explication vaseuse^^

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Chez punbb (devenu fluxbb je crois) il avait un peu le même principe si ce n'est qu'il stockais dans un cookie le tableau sérialisé des messages lu par l'utilisateur.

    Du coup rien de stocker coté serveur si ce n'est la date de dernière connexion.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 10
    Par défaut
    merci pour toutes ces réponse, je pense que je vais faire une variable de sessions qui va stoker au fur et a mesure les messages que l'utilisateur va lire (et qui était non lu).

    je vais essayer de faire un truc du genre (je vous tien au courant si jamais j'y arrive)

  9. #9
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    catégorie_1
    |_sous_catégorie_1
    |_sujet_1
    |_...
    |_sujet_n
    |_...
    |_sous_catégorie_n
    |_sujet_1
    |_...
    |_sujet_n
    ...
    catégorie_n
    Règles de gestion :
    1. Une catégorie peut avoir plusieurs sous-catégories et une sous-catégorie n'est rattachée qu'à une seule catégorie.
    2. Une sous-catégorie peut comprendre plusieurs sujets et un sujet n'est compris que dans une seule sous-catégorie.

    Notas :
    1. D'après le schéma, il n'y a pas de sujets directement dans les catégories sans sous-catégorie. Tant mieux, c'est plus simple !
    2. Toujours d'après le schéma, il n'y a pas de sous-sous...catégories. Tant mieux, c'est plus simple !

    MCD :
    Categorie -0,n----Avoir----1,1- Sous-categorie -0,n----Comprendre----1,1- Sujet

    Tables :
    Categorie (cat_id, cat_titre...)
    Sous_categorie (sc_id, sc_titre, sc_id_categorie...)
    Sujet (sjt_id, sjt_titre, sjt_id_sous_categorie...)

    Comment faire pour créer un système peu couteux en place afin de gérer pour un utilisateur les messages lu ou non lus ?
    Règles de gestion :
    1. Un sujet peut comprendre plusieurs messages et un message est compris dans un seul sujet.
    2. Un utilisateur peut lire plusieurs sujets et un sujet peut être lus par plusieurs utilisateurs.

    Nota : l'astuce consiste ici à ne pas considérer la lecture des messages mais des sujets en tenant compte de la date de lecture du sujet.

    MCD :
    Utilisateur -0,n----Lire----0,n- Sujet -1,n----Comprendre----1,1- Message

    Tables :
    Sujet (sjt_id, sjt_titre, sjt_id_sous_categorie...)
    Message (msg_id, msg_id_sujet, msg_texte, msg_date...)
    Utilisateur (uti_id, uti_nom, uti_mot_passe, uti_date_derniere_visite...)
    Lecture (lec_id_utilisateur, lec_id_sujet, lec_date)

    Avec cette structure, il est relativement facile de comparer la date de dernière visite de l'utilisateur et la date des messages pour compter combien il y a de messages non-lus dans chaque catégories et sous-catégories.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. [conception] Base de données sur le football
    Par Kakine dans le forum Modélisation
    Réponses: 25
    Dernier message: 06/01/2007, 02h27
  2. [Conception] Base de donnée + Livre d'or
    Par linkinmimil dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 24/07/2006, 14h54
  3. conception base de données
    Par LaFik dans le forum Décisions SGBD
    Réponses: 11
    Dernier message: 07/06/2006, 17h04
  4. [Conception] base de données pour sport
    Par peach dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 26/10/2005, 15h21
  5. conception base de données
    Par aaronw dans le forum Décisions SGBD
    Réponses: 8
    Dernier message: 04/05/2005, 12h39

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