2010-07-23 4 views
0

Dans ma banque de données App Engine, j'ai un type d'entité pouvant contenir un grand nombre d'entités, chacune ayant la propriété 'customer_id'. Par exemple, disons qu'un customer_id donné a 10 000 entités et qu'il y a 50 000 customer_ids.Filtre efficacement un grand nombre d'entités de banque de données avec un grand nombre de valeurs de propriété

J'essaye de filtrer ceci efficacement, de sorte qu'un utilisateur puisse obtenir l'information pour au moins 2000 customer_ids à la fois. C'est-à-dire, lisez-les à l'interface utilisateur dans la limite de 30 secondes (un filtrage supplémentaire sera effectué à l'extrémité avant, de sorte que l'utilisateur ne sera pas bombardé de tous les résultats à la fois). Ci-dessous j'ai énuméré une vue de mes modèles actuels de magasin de données. Les 'rapports' se réfèrent à des ensembles de customer_ids, donc en continuant l'exemple ci-dessus, je pourrais obtenir mes 2000 customer_ids de ReportCids.

class Users(db.Model): 
    user = db.StringProperty() 
    report_keys_list = db.ListProperty(db.Key) 

class Reports(db.Model): 
    #report_key 
    report_name = db.StringProperty() 

class ReportCids(db.Model): 
    report_key_reference = db.ReferenceProperty(Reports, collection_name="report_cid_set") 
    customer_id = db.IntegerProperty() 
    start_timestamp = db.IntegerProperty() 
    end_timestamp = db.IntegerProperty() 

class CustomerEvent(db.Model): 
    customer_id = db.IntegerProperty() 
    timestamp = db.IntegerProperty() 
    event_type = db.IntegerProperty() 

Les options je considérais:
-Effectuer une requête distincte pour chaque customer_in dans mon ensemble de 2000
listes -Utiliser des clés indiquant les événements clients, mais est limitée à 5000 entrées dans une liste (si J'ai lu)
-Get toutes les entrées et filtre dans mon code

J'apprécierais vraiment si quelqu'un avait des conseils sur la façon de le faire de la manière la plus efficace, ou si je me approche du problème complètement dans le mauvais sens. Je suis novice en termes d'utilisation efficace du magasin de données.

Bien sûr, heureux de fournir des éclaircissements ou des informations si cela aide.
Merci beaucoup!

+0

Qu'est-ce que vous essayez de récupérer exactement?Tous les ID de client pour un seul rapport, ou pour plusieurs rapports, ou tous les rapports pour un ID client? –

+0

Si je lis bien, chaque customer_id est lié à 10 000 entités, et vous voulez récupérer les entités associées à 2000 customer_ids. Récupérer 20 millions d'entités en 30 secondes ne fonctionnera pas. Si vous clarifiez ce que vous voulez vraiment présenter à l'utilisateur final, nous pouvons vous suggérer des moyens de le faire qui n'impliquent pas de récupérer autant d'entités. –

Répondre

0

Merci de me rappeler. Il semble que j'ai eu un problème avec le compte utilisé lorsque j'ai posté, donc je dois répondre dans les commentaires ici.

Après avoir réfléchi à ce sujet et à ce que vous avez dit, aller chercher autant de résultats ne fonctionnera pas.

Voici ce que j'essaie de faire: J'essaie de faire un rapport qui montre pour plusieurs ID client les événements qui se sont produits pour ce groupe de clients. Disons que j'ai un rapport pour voir les informations pour 2000 clients. Je veux être en mesure d'obtenir tous les événements (CustomerEvent), puis filtrer cela par event_type. Je demande probablement beaucoup ici, mais ce que j'espérais faire était d'obtenir tous ces événements pour 2000 clients, puis faire le filtrage event_type au début, de sorte qu'un utilisateur puisse ajuster dynamiquement le type d'événement qu'ils veulent regarder pour et obtenir des informations sur les actions réussies pour ce type d'événement.

Donc, mon principal problème est de sortir les bonnes entités de CustomerEvent efficacement.

En ce moment, je suis preneuse une liste d'ID des clients comme ceci:

cid_list = [] 
this_report = models.Reports.get(report_key) 
if this_report.report_cid_set: 
    for entity in this_report.report_cid_set: 
    cid_list.append(entity.customer_id) 

Mon estimation de 10.000 entités CustomerEvent était assez élevé, mais théoriquement, il pourrait se produire. Peut-être quand je vais obtenir les résultats du rapport, je pourrais filtrer tout de suite par le event_type spécifié par l'utilisateur. Cela signifie que je dois retourner au datastore chaque fois qu'ils choisissent une nouvelle option qui n'est pas idéale, mais c'est peut-être ma seule option compte tenu de cette configuration.

Merci beaucoup d'avoir pris le temps de regarder ça!

+0

Comment allez-vous présenter 20 millions d'enregistrements à l'utilisateur d'une manière compréhensible? Vraisemblablement, cela impliquera une sorte d'agrégation - dans ce cas, vous devez faire l'agrégation à l'écriture et récupérer les données pré-agrégées. –

Questions connexes