2010-05-12 6 views
2

J'ai un modèle Lexicon, et je veux que l'utilisateur soit capable de créer une fonctionnalité dynamique pour chaque lexique.champs de recherche dynamiques, meilleure pratique?

Et j'ai une interface de recherche compliquée qui permet à l'utilisateur de rechercher sur chaque caractéristique (y compris les caractéristiques dynamiques) appartenait au modèle Lexicon.

J'aurais pu utiliser un champ de texte sérialisé pour sauvegarder toutes les informations dynamiques si elles ne sont pas destinées à la recherche.

Si je souhaite que l'utilisateur effectue une recherche sur tous les champs, j'ai créé un modèle DynamicField pour contenir toutes les entités créées dynamiquement. Mais imaginez que j'ai 1 000 000 000 de lexique, et si on crée une fonctionnalité dynamique pour chaque lexique, cela créera 1 000 000 000 de lignes dans le modèle DynamicField. Par conséquent, la fonction de recherche sql deviendra très inefficace tout en créant de nombreuses fonctionnalités dynamiques.

Y a-t-il une meilleure solution pour cette situation?

De quel côté dois-je prendre?

  1. la recherche d'une meilleure conception db pour les champs dynamiques

  2. essayer d'accordage mysql (ajouter des champs de cache, ajoutez l'index ...) avec la conception actuelle db

+0

1. Comment vos tables DB (ou modèles Rails) sont-elles en ce moment? Peut-être un instantané de code? 2. Quel genre de requêtes voulez-vous soutenir? (ÉGALE, IN, PAS DANS, COMME, PLUS GRAND QUE, etc.) –

+0

Le modèle de conception que vous pourriez vouloir aller est: http://en.wikipedia.org/wiki/Entity-attribute-value_model – DJTripleThreat

+0

Ordinaire, le type de la recherche je veux mettre en œuvre est comme, moins de, plus grand que, dans, égal, pas dans – boblu

Répondre

2

Une autre idée pourrait être d'utiliser MongoDB et MongoMapper, Thinking Sphinx ou Solr. Voici Railscast sur l'utilisation de Mongo: http://railscasts.com/episodes/194-mongodb-and-mongomapper

+0

Je regarde maintenant mongodb. Je posterai une mise à jour si je trouve une solution décente. Merci pour relpy – boblu

+0

Cool, j'ai utilisé Solr dans le passé mais c'est vraiment difficile à installer, surtout sur une machine Linux, donc je pense que MongoDB est supposé être très facile à utiliser. – DJTripleThreat

1

Je pense que la Le meilleur moyen de le faire est d'utiliser un appariement nom/valeur au lieu de champs dynamiques. Permettez-moi d'expliquer à l'aide du EAV design pattern

Ainsi, au lieu d'avoir quelque chose comme ceci:

Table: MedicalRecords 
<table> 
    <tr> 
    <th>Temperature in degrees Fahrenheit</th> 
    <th>Presence of Cough</th> 
    <th>Type of Cough</th> 
    <th>Heart Rate in beats per minute</th> 
    <th>Column X</th> 
    <th>Column X + 1</th> 
    <th>... Column N</th> 
    </tr> 
    <tr> 
    <td>102</td> 
    <td>True</td> 
    <td>With phlegm, yellowish, streaks of blood</td> 
    <td>98</td> 
    <td>????</td> 
    <td>????</td> 
    <td>????</td> 
    </tr> 
</table> 

Vous concevez votre table comme ceci:

Table: MedicalRecords 
<table> 
    <tr> 
    <th>Name</th> 
    <th>Value</th> 
    </tr> 
    <tr> 
    <td>Temperature in degrees Fahrenheit</td> 
    <td>102</td> 
    </tr> 
    <tr> 
    <td>Presence of Cough</td> 
    <td>True</td> 
    </tr> 
    <tr> 
    <td>Type of Cough</td> 
    <td>With phlegm, yellowish, streaks of blood</td> 
    </tr> 
    <tr> 
    <td>Heart Rate in beats per minute</td> 
    <td>98</td> 
    </tr> 
    <tr> 
    <td>Column X</td> 
    <td>????</td> 
    </tr> 
    <tr> 
    <td>Column X + 1</td> 
    <td>????</td> 
    </tr> 
    <tr> 
    <td>... Column N</td> 
    <td>????</td> 
    </tr> 
</table> 

(Essayé pour obtenir les étiquettes de table pour travailler, mais n'a pas pu essayer de copier mon code dans un fichier html pour obtenir l'idée.)

+0

Merci pour l'explication sur le modèle de conception EAV. Je viens de lire cette page wiki que vous m'avez donnée sur ce sujet, et j'en ai eu une petite idée. Ce que je veux demander, c'est comment implémenter le modèle de conception EAV dans un db traditionnel (le db relationnel)? Ou je pense que le mongodb lui-même a déjà implémenté ce modèle de conception EAV en interne, suis-je ici? – boblu

+0

Utilisez cet exemple comme un moyen de le faire dans une base de données relationnelle, mais utilisez MongoDB pour publier XML (un exemple parfait de définition de données dynamiques) dans MongoDB. Si MongoDB est quelque chose comme Solr ou Thinking Sphinx, vous serez en mesure de faire des recherches très complexes contre cela. Par exemple, si vous avez une base de données de produits mais que les produits ont des attributs différents (les livres ont des pages, les ordinateurs portables ont la batterie, etc.), vous pouvez utiliser un langage de requête spécial pour renvoyer les résultats souhaités. Voici un exemple de tuyau que Solr fait: http://lucene.apache.org/solr/tutorial.html – DJTripleThreat