2010-01-13 4 views
4

Je travaille sur un site web qui a des utilisateurs et des articles générés par les utilisateurs, des galeries et des vidéos. J'essaie de créer un système de marquage et de les rechercher tous. Au début, je pensais en tbl_articles, tbl_galleries et tbl_videos que j'aurais un titre, une description et un champ de tags. Ensuite, exécutez une requête comme suit pour chaque:Quel système de recherche/balise est le meilleur?

select * from tbl_articles where match(title, description, tags) 
    against ('$search' in boolean mode) ORDER BY match(title, description, tags) 
    against ('$search' in boolean mode) DESC, views desc LIMIT 0, 3 

La même requête pour tbl_galleries et tbl_videos. Pour les utilisateurs, il suffit de comparer le nom d'utilisateur. Ensuite, affichez trois de chaque sur la page de résultats avec un bouton «more» (style facebook). Lorsque vous regardez un article, une galerie ou une vidéo, il y aura aussi des liens vers du contenu connexe, donc je pensais utiliser la même requête seulement avec le LIMIT réglé sur '1,3' - pour éviter de s'afficher.

Q1 - Comment est ce système?

Je suis satisfait du système, jusqu'à ce que je this

où ils ont

  • une table « balises » qui contient deux colonnes un id primaire et un tag_name unique indexé.
  • une table « type » pour lequel ils ont un autre identifiant primaire et un unique (catégorie) indexé « type » (je pensais je pourrais l'utiliser pour utilisateur/vidéo/article/galerie)
  • un ' table de recherche contenant l'adresse de l'article avec un identifiant étranger de 'tags' et 'type'. (Je pensais au lieu d'une URL complète que je pouvais stocker l'ID étranger connexes afin que je peux générer l'URL par exemple article.php id = ....?)

Q2 - Cette Le système semble beaucoup plus efficace ... mais comment rechercher le titre ou la description?

Q3 - L'autre mauvaise chose est que pour chaque page, je devrais joindre les tags ... donc ce n'est peut-être pas beaucoup plus efficace.

Q4 - Mon système recherche uniquement les booléens, serais-je mieux avec une requête 'like'? - Je limite mes utilisateurs à 4 tags, mais j'encourage les mots simples (style stackoverflow) ... Je me rends compte cependant que dans mon système une recherche de 'station de train' ne correspondra pas à une étiquette comme ' train-station "comment est-ce que je contourne ceci?

Tant de questions ... Désolé c'est trop long. Je vous remercie.

Répondre

2

Q1 - vous êtes mieux lotis avec trois tableaux séparés pour les articles, les étiquettes et une table de liaison reliant les articles et les étiquettes. Vous pouvez également le faire avec deux tables pour les articles et une table articles_tags. La table articles_tags contiendrait un champ articleID et l'étiquette elle-même en tant que clé composée.Deux ou trois tables permettent de trouver facilement quels articles ont une étiquette donnée et quelles étiquettes sont assignées à un article donné. Q2 - les recherches de titre et de description peuvent être effectuées en utilisant "like" avec des pourcentages ou avec une recherche regex ou en texte intégral.

Q3 - ne vous inquiétez pas de joindre les tables de tags avec les autres. Pour paraphraser Knuth, construisez-le d'abord, puis trouvez les goulots d'étranglement. MySQL est très bon dans ce qu'il fait. Rejoindre ces tables ensemble encore et encore et encore ne fera pas de mal.

Q4 - Cela dépend de ce que vous voulez sortir des résultats. Habituellement, vous voulez les données réelles, puis vous pouvez simplement tester le nombre de lignes retournées pour vous dire si c'est vrai ou faux. Q5 - encore une fois, vous devrez utiliser une syntaxe "like" et peut-être une expression rationnelle créative du côté PHP avant que la requête ne soit transmise à la base de données.

bonne chance!

+0

Merci pour votre réponse. Une autre question ... où recommandez-vous que je mets le titre et la description - dans leurs tables d'origine? – Mark

+0

Il semble qu'ils utilisent tag_target_name et tag_target_url pour créer les liens vers le contenu étiqueté. Vous pouvez mettre votre titre et votre description à leur place, mais la meilleure solution est d'avoir toutes ces informations dans une table séparée "articles" et de simplement stocker l'identifiant de la ligne dans la table articles dans la table tag_targets. De cette façon, vous ne répétez pas le titre et la description de chaque tag sur chaque article. –

Questions connexes