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

  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 : 38
    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 : 38
    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 : 38
    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');

  7. #7
    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
    Dans ton exemple oui on est d'accords

    Maintenant imagine qu'un terme est unique (dictionnaire de termes) et que je relie ces termes à des "catégories", à la wordpress.

    C'est plus optimisé pour moi d'aller lire un champ "count" que je tiens à jour que d'exécuter une requête à chaque fois.

    Ta soluce est parfaite à condition qu'une seule ressource consomme les tags, si j'ai plusieurs ressources qui consomment les tags et que je veux générer un nuage de tags propre à chacune d'entre elle, je ne souhaite pas pour autant dupliquer mes termes dans mon dictionnaire. Tu vois où je veux en venir ?

    La conception de wordpress résout ce problème mais ne colle plus à mon cas de figure.

  8. #8
    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
    Je reprend un exemple.

    Imagine que tu as des photos sur lesquelles tu peux identifier les personnages et de quel média ils sont extraits.

    Tu peux aussi créer une fiche "Personnage" dans laquelle tu as le nom du personnage, c'est l'équivalent des tags "Personnages" d'une photo mais non multiple. Tu as aussi "extrait de" qui lui aussi est l'équivalent du champ tags "extrait de" de ma photo mais non multiple.

    Si je tag une photo de cette manière (sur la photo deux personnages de deux films différents) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Titre : ma super photo
    Extrait de : Gladiator, Big Fish
    Personnages : Maximus, Edward Bloom
    Date : 01/01/2009
    Maintenant je crée une fiche Personnage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Nom : Maximus
    Extrait de : Gladiator
    Acteur : Russell Crowe
    L'intérêt est de ré-utiliser le même "terme" et de ne pas le dupliquer dans la base de données, mais il faut bien séparer l'association entre un personnage et ses tags et une photo et ses tags.

    Pour ça je propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    photos (photo_id, title, date)
    characters (character_id, actor_name)
    
    terms (term_id, name)
    taxonomy (taxonomy_id, term_id, name)
    
    photo_tags (photo_id, taxonomy_id)
    character_tags (characted_id, taxonomy_id)
    Dans lequels on pourrait avoir :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    INSERT INTO photos (title, date) VALUES ('ma super photo', '2009-01-01');
    INSERT INTO characters (actor_name) VALUES ('Russell Crowe');
     
    INSERT INTO terms (name) VALUES 
        ('Gladiator'),
        ('Big Fish'),
        ('Maximus'),
        ('Edward Bloom')
    ;
     
    INSERT INTO taxonomy (term_id, name) VALUES
        (1, 'film_tag'),
        (2, 'film_tag'),
        (3, 'character_tag'),
        (4, 'character_tag')
    ;
     
    INSERT INTO photo_tags (photo_id, taxonomy_id) VALUES
        (1, 1),
        (1, 2),
        (1, 3),
        (1, 4),
    ;
     
    INSERT INTO character_tags (character_id, taxonomy_id) VALUES
        (1, 1),
        (1, 3)
    ;
    Qu'est-ce que tu en penses ? J'arrive pas à être convaincu

    Soit je pars dans un délire et c'est n'importe quoi, soit c'est génial mais là j'arrive pas à me dire "Ouaiis c'est ça la soluce" :p

    En fait je cherche pas une souplesse absolue dans mes tags, dans le sens où la hiérarchie est prédéfinie (il ne s'agit pas d'un cms qui laisse libre de faire ce qu'on veut).

    Merci pour ton aide,
    A+ benjamin.

  9. #9
    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 : 38
    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
    C'est tout l'intérêt de la table tags_set que j'ai créé.

    Mais comme tu l'entends, un tag n'est associé qu'à un unique jeu de tags (tags_set) dans mon exemple.

    Je regarde ton post plus en détails dans la soirée si tout va bien.

Discussions similaires

  1. Réponses: 11
    Dernier message: 24/09/2013, 11h06
  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, 13h03
  3. [Tableaux] Système de catégorie
    Par Moxostoma dans le forum Langage
    Réponses: 6
    Dernier message: 03/09/2007, 19h55
  4. [Système] Les meta-tag d'un site
    Par dragon noir dans le forum Langage
    Réponses: 7
    Dernier message: 17/07/2006, 11h35

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