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 :

Système de catégorie / tags


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
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Par défaut Système de catégorie / tags
    Bonjour,

    Je suis en train de réfléchir à un système de tags, et je me pose certaines questions auxquelles certains d'entre vous pourront peut-être répondre.

    Je m'inspire bien sûr des systèmes existants, à savoir ceux de Worpress, Drupal ou autre. Pour le moment pour mon projet, un système de catégorie (term ?) + tags à la wordpress, me semble le plus approprié.

    Voilà la problématique, une ressource peut-être "taguée" à plusieurs niveaux. C'est pas le sujet du projet, mais admettons par ex. que nous souhaitons classer des photos de films/séries et identifier les personnages sur la photo.

    Imaginons maintenant que j'ai une photo sur laquelle j'ai deux personnages de deux films différents. Je vais donc avoir du tag multiple pour chaque "type" de tag. Lors de la saisie des tags, je vais avoir un formulaire du type :

    Film(s)/série(s) : ______________ <--- Noms des films ou séries présents sur la photos = tags (multiples)
    Personnage(s) : ______________ <--- Noms des personnages présents sur la photo = tags (multiples)
    Tags (libre) : _______________ <--- Tags (multiples)


    Comment traduire ça en base de données ?

    De même je peux très bien avoir une ressource avec des tags uniques, par ex. je veux ajouter une fiche personnage, j'aurais un formulaire du type :

    Personnage : _______________ <--- Tag unique
    Film/Série : _______________ <--- Tag unique


    Je dois donc designer une solution qui fonctionne pour les deux cas.

    Si j'ai bien compris le principe, on crée des "thèmes" de tags, ensuite les tags sont insérés puis reliés à leurs thèmes respectif, et chaque ressource est liée à un ou plusieurs tags via une table de relations.


    Je fais fausse route ?


    Merci par avance pour vos remarques.

    A+, Benjamin.

    Edit : source d'inspiration : http://www.notesbit.com/download/med..._27_schema.png
    Edit2 : Je suis peut-être pas dans la bonne section, je me dis que ça serait peut-être mieux dans les fofo "conception" (pardon si c'est le cas :p)

  2. #2
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Bonjour,

    tout simplement il suffit d'avoir une structure de tags arborescentes, que tu peux présenter dans un arbre HTML (treeview) avec une case à cocher pour chaque noeud.

    Concernant le modèle DB, ceci suffit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tags_set (id_tag_set, set_name)
    tags (id_tag, text, id_parent_tag, id_tag_set)
    tags_pages (id_tag_page, id_tag, id_page)
    J'ai mis une table tags_set dans l'idée où tu voudrais gérer plusieurs jeux de tags.

    Ensuite avec une fonction récursive tu fais ton bonheur.

    La majorité des systèmes de tags n'implémentent pas ce modèle, qui donne pourtant beaucoup de flexibilité... Le système de taxo de Drupal est beaucoup trop limité par exemple...

  3. #3
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Bonsoir,
    je me rend compte que ma réponse ne se suffit pas à elle-même.

    Avec le modèle de base de données que j'ai donné ci-dessus, tu pourrais avoir un taggage de cette forme :

    [v] représentant une case à cocher.
    [v] Types
    ----[v] Fiction
    ----[v] Humour
    ----[v] Action
    [v] Noms
    ----[v] Nom film 1
    ----[v] Nom film 2
    ----[v] Nom film 3
    [v] Personnages
    ----[v] Nom personnage 1
    ----[v] Nom personnage 2
    [v] Professions
    ----[v] Acteur
    ----[v] Réalisateur
    ----[v] Producteur
    ...
    Ce qui donnerait le SQL suivant :
    tags_set (id_tag_set, set_name)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO tags_set (set_name) VALUES ('mediatheque');
    tags (id_tag, text, id_parent_tag, id_tag_set)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    INSERT INTO tags (text, id_parent_tag, id_tag_set) VALUES 
        ('Types', NULL, 1),
            ('Fiction', 1, 1),
            ('Action', 1, 1),
            ('Humour', 1, 1),
        ('Personnages', NULL, 1),
            ('Nom du personnage 1', 5, 1),
            ('Nom du personnage 2', 5, 1),
        ('Noms', NULL, 1),
            ('Nom du film 1', 8, 1),
            ('Nom du film 2', 8, 1),
            ('Nom du film 3', 8, 1),
        ('Professions', NULL, 1),
            ('Acteur', 12, 1),
            ('Réalisateur', 12, 1),
            ('Producteur', 12, 1)
    ;
    et si par exemple si as des pages en base de données, tu peux leur associer des tags de cette manière.
    tags_pages (id_tag_page, id_tag, id_page)
    À la page d'identifiant 189, j'associe les tags Humour ainsi que Personnage 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INSERT INTO tags_pages (id_tag, id_page) VALUES
        (4, 189)
        (6, 189)
    ;
    Ensuite pour le moteur d'affichage, plus que regarder les pages dont les tags cochées matchs exactement, tu pourrais construire un algorithme qui te permettrait de définir l'importance des pages remontées (id_page dans la table tags_page) en fonction de l'éloignement du tag coché par rapport à celui qui a matché (en remontant sur le parent et en bouclant sur les enfants).

    Je ne sais pas si je suis très clair mais j'ai créé et implémenté ce type d'algorithme pour une arborescence de tags qui contenait plus de 1000 tags et jusqu'à 7 niveaux, la qualité des résultats est plutôt sympa.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Par défaut
    Hello,

    Je reviens un peu tard, j'étais dans d'autres sphères

    Merci pour ta réponse, je vais l'étudier attentivement dès que possible et je te fais un retour.


    A+ benjamin.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Par défaut
    Salut,

    Je me penche de nouveau sur ce sujet.

    Je voudrais ne pas dupliquer les termes (dictionnaire) et pouvoir stocker le nombre de fois qu'un terme est utilisé et ça groupé par category de tags (pour les nuages et pas avoir à faire un COUNT chaque fois).

    Dans ton exemple il me semble qu'il suffit d'ajouter un champ "count" dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tags (text, id_parent_tag, id_tag_set, count)
    Mais je sais pas un truc me dérange, je ne sais pas quoi encore, mais je sens qu'il y a un truc qui va pas parce qu'admettons que je puisse tagger d'autres ressources que photo, je vais devoir dupliquer mes tags puisque les nuages seront différents.

  6. #6
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Le nombre de fois qu'un tag est utilisé n'est pas une valeur à stocker, cette information est inhérente au nombre d'enregistrements dans la table tags_pages pour un id_page donné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    # $id_page = 1;
    $count = mysql_result(mysql_query('SELECT COUNT(id_tag) AS nb FROM tags_pages WHERE id_page='.intval($id_page)), 0, 'nb');

Discussions similaires

  1. Réponses: 11
    Dernier message: 24/09/2013, 12h06
  2. [MySQL] Système de catégorie
    Par Moxostoma dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 20/04/2008, 14h03
  3. [Tableaux] Système de catégorie
    Par Moxostoma dans le forum Langage
    Réponses: 6
    Dernier message: 03/09/2007, 20h55
  4. [Système] Les meta-tag d'un site
    Par dragon noir dans le forum Langage
    Réponses: 7
    Dernier message: 17/07/2006, 12h35

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