2010-08-05 3 views
2

Je suis actuellement en train de développer mon propre système de blogging. Actuellement, lorsque vous créez un nouveau message, vous avez la possibilité d'archiver les catégories de votre choix.Chaîne de stockage et de recherche MySQL

Actuellement, je stocke les catégories en tant que valeur VARCHAR dans une base de données mysql. À titre d'exemple, le champ contiendra 2,4,8 si l'utilisateur a choisi les catégories avec ID: 2, 4 et 8.

Pour récupérer les messages de blog pour la catégorie avec ID 4 J'utilise ensuite:

SELECT col FROM table WHERE LOCATE(',4,', CONCAT(',',col,',')) 

On m'a dit que les valeurs séparées par une virgule décimale est un non-go (très mauvais) quand il s'agit de bonne structure de base de données!

Quelqu'un peut-il me fournir un bon moyen/technique pour faire de cette façon la plus efficace?

Merci à l'avance

Répondre

1

Une & souple de configuration robuste, telle que diffusée tant de fois dans SO:

POSTS 
id 
name 
text 

CATEGORIES 
id 
name 

POST_CATEGORIES 
post_id 
category_id 

Lorsque la requête en cours serait:

SELECT p.id, p.name, p.text 
FROM posts p 
JOIN post_categories pc 
ON pc.post_id = p.id 
AND pc.category_id = 4; 
0

Regardez dans la base de données relationnelle normalisation. Dans votre cas, envisagez de créer 2 tables, catégories et catégories de blogs supplémentaires en plus de votre tableau de contenu Blog. Les catégories contiennent la définition de tous les tags/catégories et rien d'autre. La table BlogCategories est une table de références croisées plusieurs-à-plusieurs qui, dans votre cas, contient probablement la référence de clé étrangère à la table Blog et la référence de clé étrangère à la table Catégories. Cela permet d'associer 1 entrée de blog à plusieurs catégories et 1 catégorie à associer à plusieurs entrées de blog.

Extraire les données ne sera pas plus difficile qu'une jointure de 3 tables au pire et vous serez hors de la sous-chaîne pour comprendre notre logique métier.