2010-05-15 6 views
4

Im travaillant sur un site de partage d'images et souhaitant implémenter le marquage pour les images.Quelle est l'efficacité de cette solution de marquage?

J'ai lu Questions #20856 et #2504150

J'ai quelques préoccupations à l'approche sur les questions ci-dessus. Tout d'abord, il semble facile de lier une image à un tag. Cependant, obtenir des images par relation de tag n'est pas aussi facile. Pas facile car vous devrez obtenir la relation image-tag d'une table puis faire une grosse requête avec un tas d'instructions OR (une OR pour chaque image).

Avant je recherche même le sujet de marquage i commencé à tester la méthode suivante:

Ce tableaux comme exemples:

Table: Image 
Columns: ItemID, Title, Tags 

Table: Tag 
Columns: TagID, Name 

Les Balises colonne dans la image tableau prend une chaîne avec plusieurs tagID du Étiquette table entourée de tirets (-).

Par exemple:

-65-25-105- 

Liens une image avec le TagID 65,25 et 105.

Avec cette méthode, je trouve plus facile d'obtenir des images par tag que je peux obtenir le TagID avec une requête et d'obtenir toutes les images avec une autre requête simple comme:

SELECT * FROM Image WHERE Tags LIKE %-65-% 

donc, si je utiliser cette méthode pour le marquage,

Quelle est l'efficacité?

L'interrogation par LIKE% -65-% est un processus lent?

À quels problèmes puis-je faire face à l'avenir?

Répondre

4

Vous avez besoin de 3 tables pour cela.

Table: Image 
Columns: ImageId, ItemID, Title 

Table: Image_Tag 
Columns: ImageId, TagId 

Table: Tag 
Columns: TagID, Name

ensuite pour obtenir toutes les images pour un tag que vous utilisez:

SELECT ImageId, Title 
FROM Image_Tag LEFT JOIN Image USING (ImageId) 
WHERE TagId = $TagId

C'est la manière typique de gérer plusieurs à plusieurs relations dans une base de données relationnelle. Vous auriez probablement avantage à lire sur http://en.wikipedia.org/wiki/Database_normalization

Modifier: Je vois que c'était déjà des adresses dans les autres questions que vous avez référencées, donc je vais vous expliquer plus loin. Le plus gros problème que je vois de le faire à votre façon est que vous ne pouvez pas tirer parti de l'indexation de vos colonnes d'identification, ce qui rend vos requêtes moins efficaces. Il semble aussi qu'il serait maladroit de mettre à jour. Je suggère fortement de ne pas essayer de le faire de cette façon, au moins essayer d'utiliser la solution 3 table. Une fois qu'il "clique" pour vous, vous me remercierez.

+1

Merci pour votre contribution, c'est juste que j'ai lu beaucoup d'histoires de LEFT JOIN étant lent. Je vais aller avec les trois tables, les gens semblent vraiment creuser ça. – Pablo