3

Was ist die beste Methode für die Filterung basierend auf einem Fremdschlüssel Eigenschaft in einer nicht-relationalen Datenbank? Ich verstehe, dass das Fehlen von join Unterstützung die Dinge komplizierter macht, und so fragte ich mich, wie andere es geschafft haben.Filter auf Fremdschlüssel Eigenschaft in Django-Nonrel

In meinem Fall habe ich Ereignisse, die zu Standorten gehören, die zu Regionen gehören. Ich möchte alle Ereignisse in einer bestimmten Region filtern. Ein Event hat eine site Eigenschaft, die ein Fremdschlüssel zu einem Site ist, die wiederum einen region Fremdschlüssel zu einem Region hat:

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

Das funktioniert nicht, weil site__region ein join erfordert und das wird nicht unterstützt auf django-nonrel läuft auf Google App Engine. (Ich Caught DatabaseError while rendering: This query is not supported by the database. als Fehler.) Ich habe also durch Veranstaltungen wurde laufen, diejenigen hinzufügen, die zu einer Liste anzeigen lassen:

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

Ist dies ein guter Weg, Dinge zu tun, zu sein? Gibt es etwas Dummes, das ich übersehen habe? Danke im Voraus!

Antwort

8

Das ist eine sehr ineffiziente Lösung, weil Sie Site und Region dereferenzieren und viele und viele Abfragen verursachen. Dies wird nicht über 100 Ereignisse in Ihrer Datenbank hinaus skalieren.

Die beste Lösung ist die Denormalisierung Ihrer Daten durch Kopieren von z. die ID der Region in Event on save(). Dann können Sie Event.objects.filter (region_id = regionID) direkt ausführen. Der resultierende Code wird weniger sauber und wartbar, aber das ist die Art, wie Dinge mit nicht-relationalen DBs arbeiten, heute.

Alles, was ich jetzt sagen kann, ist: Warte bis Ende Januar, wenn du kannst. ;)

+0

Ist der Januar ein Verweis auf SQL-Datenbanken auf GAE? Weil sie immer "das Ende des Jahres" anführen und das Jahr scheint nie zu enden. : P – munchybunch

+0

Oh wow, du bist der Entwickler von Django-Nonrel !? Das ist großartig, danke für deine Arbeit. Freu mich auf Januar ... – munchybunch

1

Januar ist weg und dbindexer unterstützt jetzt einfache JOINS. Sie können über hier lesen: http://www.allbuttonspressed.com/blog/django/joins-for-nosql-databases-via-django-dbindexer-first-steps

Wenn Sie bereits verwenden dbindexer sollten Sie einfach Ihre Index registrieren so etwas wie dies mit:

# photo/dbindexes.py: 

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

register_index(Event, {'site__region': StandardLookup(),}) 
Verwandte Themen