2017-06-05 1 views
0

Je développe un site Web avec api qui peut être consulté à partir de clients mobiles, l'application est quelque chose de similaire à http://zomato.com/recherche base de données optimisé algorithme

permet de dire que nous avons la table voiture (carid, modèle, fabricant, transmission, fuleType, otherOptions)

l'utilisateur peut interroger l'un des champs, la requête peut également inclure des champs dans d'autres tables, par exemple si je crée une table séparée pour les décideurs et les modèles.

bien sûr, je peux interroger en utilisant la clause like sur tous les champs, est-ce la bonne façon? quand il pourrait y avoir des milliers d'enregistrements?

J'ai besoin d'une réponse rapide en temps réel à l'interrogation lors de l'utilisation de l'application mobile ou du site Web.

Je connais le mieux .Net mais je serais heureux que vous me donniez d'autres recommandations et que vous me guidiez sur le point de départ (bibliothèques, projets open source existants).

Note: l'utilisateur n'aura un champ de recherche filtres et en option comme modèle, catégorie, etc ...

Répondre

0

Voici ce que je ferais. Composez votre requête en utilisant un IQueryable. Vous pouvez utiliser if pour vérifier si l'un de vos paramètres a une valeur et si c'est le cas, ajoutez l'instruction where à votre requête. Une fois que votre requête est définie, envoyez-la en mémoire avec un .ToList ou un .AsEnumerable.

public List<Data> Search (string param1, string param2) 
{ 
    IQueryable<Data> query = db.SomeTable; 

    if (!String.IsNullOrEmpty(param1)) 
     query = query.Where(m => m.Field1 == param1); // might use contain depending on your use case 

    if (!String.IsNullOrEmpty(param2)) 
     query = query.Where(m => m.Field2 == param2); 

    return query.ToList(); 
} 

J'utiliserais aussi un Skip et Take pour la pagination.

Edit: Je voulais noter que c'est à peu près aussi rapide que vous obtiendrez avec une base de données que je connais, si quelqu'un d'autre connaît une fonction plus rapide s'il vous plaît faites le moi savoir. Vous pouvez obtenir une réponse plus rapide en utilisant une base de données NoSQL et des documents statiques, mais pour plusieurs milliers d'enregistrements, une base de données devrait fonctionner correctement.

+0

Oui, je suis conscient de cette technique pour interroger la base de données mais dans mon cas, vous ne saurez pas quel champ il interroge, donc je cherchais quelque chose de plus avancé. et je voulais un moyen de donner une réponse en temps réel au client API par exemple quand il tape les trois premiers caractères commencent à filtrer comme les moteurs de recherche, et je ne peux pas utiliser les documents dont il a besoin pour être une base de données. –

+0

Pour un type de recherche automatique complet, vous avez besoin d'une liste de mots-clés. Il serait préférable de créer une table de tous les mots-clés soumis et vous pouvez utiliser une règle générale qui dit si un mot-clé a été soumis X nombre de fois l'ajouter à la table mot-clé qui est utilisé pour votre auto complète. Vous devez également implémenter une liste blanche et noire pour les mots-clés. En ce qui concerne la requête ce que vous avez devrait être très bien, plusieurs instructions où sur chaque champ. Vous voulez probablement vous concentrer sur l'optimisation de la base de données qui est en dehors de la requête, comme les index, la mise en cache, etc ... –

+0

J'aime l'idée de la boîte noire/blanche, alors vous voulez faire deux requêtes à la base de données (une initiale pour charger automatiquement les données complètes) l'autre est d'obtenir de vrais résultats. Je vois ce que j'essaie de faire n'est pas très compliqué comme je le pensais, mais puisque vous avez mentionné NoSql, je n'ai pas encore utilisé cela, j'ai lu des articles à ce sujet mais je n'ai pas pu confirmer navires entre les entités de base de données), je ne veux pas changer l'objet de la question. mais je ne sais pas si je vais aller avec la base de données relationnelle ou dois-je passer plus de temps à apprendre de nouvelles techniques (le NoSql) –