3

Quelle est la meilleure pratique pour le filtrage basé sur la propriété d'une clé étrangère dans une base de données non relationnelle? Je comprends que le manque de soutien rend les choses plus compliquées, et je me demandais comment les autres se débrouillaient.filtre sur la propriété de clé étrangère dans django-nonrel

Dans mon cas, j'ai des événements, qui appartiennent à des sites, qui appartiennent à des régions. Je veux filtrer tous les événements dans une région donnée. Un Event a une propriété site qui est une clé étrangère à un Site, qui à son tour a une region clé étrangère à un Region:

region = Region.objects.get(id=regionID) 
events = Event.objects.filter(site__region=region) 

Cela ne fonctionne pas, car site__region exige une join et ce n'est pas pris en charge sur django-nonrel fonctionnant sur Google App Engine. (Je reçois Caught DatabaseError while rendering: This query is not supported by the database. comme une erreur.) Je l'ai donc été itérer à travers des événements, en ajoutant ceux qui correspondent à une liste:

events = list() 
region = Region.objects.get(id=regionID) 
for event in Event.object.all(): 
    if event.site.region==region: 
     events.append(event) 

Est-ce une bonne façon de faire des choses? Y a-t-il quelque chose de stupide que j'ai oublié? Merci d'avance!

Répondre

8

C'est une solution très inefficace car vous déréférencer le site et la région, ce qui provoque beaucoup, beaucoup de requêtes. Cela ne va pas au-delà de peut-être 100 événements dans votre base de données.

La meilleure solution consiste à dénormaliser vos données en copiant par ex. l'identifiant de la région dans Event on save(). Ensuite, vous pouvez directement faire Event.objects.filter (region_id = regionID). Le code résultant devient moins propre et maintenable, mais c'est ainsi que les choses fonctionnent sur les bases de données non relationnelles, aujourd'hui. Tout ce que je peux dire pour le moment, c'est: Attendez jusqu'à la fin du mois de janvier si vous le pouvez. ;)

+0

La partie Janvier une référence aux bases de données SQL sur GAE? Parce qu'ils citent toujours "la fin de l'année" et que l'année ne semble jamais se terminer. : P – munchybunch

+0

Oh wow, vous êtes le développeur de django-nonrel !? C'est génial, merci pour tout votre travail. Dans l'attente de janvier ... – munchybunch

1

Janvier a disparu et dbindexer prend désormais en charge les simples JOINS. Vous pouvez lire ici: http://www.allbuttonspressed.com/blog/django/joins-for-nosql-databases-via-django-dbindexer-first-steps

Si vous utilisez déjà dbindexer il vous suffit d'enregistrer votre index en utilisant quelque chose comme ceci:

# photo/dbindexes.py: 

from models import Event 
from dbindexer.lookups import StandardLookup 
from dbindexer.api import register_index 

register_index(Event, {'site__region': StandardLookup(),}) 
Questions connexes