2009-09-07 5 views
0

Je dois afficher le nombre de résultats pour une catégorie donnée et masquer les catégories qui ne donnent aucun résultat.Comment construire une recherche avec le nombre de résultats pour chaque catégorie?

Exemple: This Yahoo!Jobs page montre le nombre de résultats dans des catégories comme la ville, catégorie d'emploi, etc. Expérience

Je travaille en C#/Asp.Net et la peur que notre serveur étouffer sans une certaine mise en cache sérieux et l'optimisation SQL .

Comment iriez-vous créer une solution comme celle-ci?

+0

Quel type de base de données utilisez-vous? Oracle, MySQL, etc – Partial

+0

Voir mon commentaire à la réponse de George Mauer ci-dessous. – comichael

Répondre

0

Je pense que vous devrez aller beaucoup plus de détails sur votre installation. Utilisez-vous un ORM? Les données sont-elles déjà en mémoire? Comment la demande arrive-t-elle? Quelle est précisément votre préoccupation? Avez-vous fait un profilage pour déterminer que c'est effectivement un problème? Je ne peux pas insister sur ce dernier assez. Assurez-vous que ce dont vous avez peur est un problème réel avant d'essayer de trouver des solutions.

Pour tenter une réponse cependant, si vous faites quelque chose comme ça

_categoryRepository 
    .Where(category=>category.Matches(query)) 
    .Select(category.Items.Count()) 

Count() ne sera exécuté que pour les catégories où retourne category.Matches (requête) vrai.

+0

Je construis une solution vieille de 7 ans sans ORM, sans objets, simplement de vieux jeux de données. Le nombre total de lignes est grand (10 Ko), donc ce n'est pas une option pour conserver toutes les données en mémoire. Refactoriser/reconstruire pour utiliser DDD/linq serait super, mais il n'y a pas de temps pour ça. Donc ... en ce qui me concerne, j'ai besoin d'ajouter une requête pour chaque catégorie dans chaque catégorie (select count (*) où city == '[city]'). Et il y aura littéralement des centaines de ces "comptes-requêtes" pour chaque requête principale - c'est ma grande inquiétude. Le site est assez lent aujourd'hui, donc même si aucun profilage n'est fait, je peux deviner le résultat. – comichael

+1

@comichael - Là où il y a peu d'options, il y a peu de solutions. Si la seule chose que vous souhaitez utiliser est SQL, la seule solution disponible est la mise en cache. Au minimum, construisez une classe de référentiel de catégorie qui cache le SQL brut - il sera plus facile de mettre en cache à ce niveau. En outre, vous devez profiler même si le site est lent - êtes-vous certain que la base de données est le goulot d'étranglement? Dans les applications asp.net, c'est généralement autre chose. –

0

La manière typique de faire ces comptes est via la mise en cache. Le modèle doit avoir un déclencheur à insérer dans les tables appropriées, puis mettre à jour un champ calculé avec 'CurrentCount'.

Vous pouvez ajouter d'autres niveaux de mise en cache dans l'application elle-même, de sorte que le nombre ne soit incrémenté que toutes les quelques heures, ou similaire.

Il est nettement préférable de compter toutes les lignes à chaque fois, mais cela signifie que vous devez savoir à l'avance quelles sortes de données vous allez compter, afin de pouvoir les calculer à l'avance.

Questions connexes