3

非リレーショナル データベースで外部キーのプロパティに基づいてフィルタリングするためのベスト プラクティスは何ですか? joinサポートがないことが事態を複雑にしていることは理解しています。

私の場合、地域に属するサイトに属するイベントがあります。特定の地域のすべてのイベントをフィルター処理したいと考えています。AnEventには、 への外部キーであるsiteプロパティがSiteあり、次に、 へのregion外部キーがありRegionます。

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

これは機能しません。site__region にはjoinand が必要であり、Google App Engine で実行されている django-nonrel ではサポートされていないためです。(Caught DatabaseError while rendering: This query is not supported by the database.エラーとして表示されます。)このように、イベントを繰り返し処理し、一致するイベントをリストに追加しました。

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

これは物事を行うための良い方法ですか?私が見落としているばかげたことはありますか?前もって感謝します!

4

2 に答える 2

8

これは非常に非効率的なソリューションです。サイトと地域を参照解除し、非常に多くのクエリが発生するためです。これは、DB でおそらく 100 個のイベントを超えて拡張することはできません。

最善の解決策は、save() で領域の ID を Event にコピーするなどして、データを非正規化することです。その後、直接 Event.objects.filter(region_id=regionID) を実行できます。結果として得られるコードはクリーンで保守しにくくなりますが、それが今日の非リレーショナル DB での動作方法です。

今言えることは、できれば1月末まで待ってくださいということだけです。;)

于 2010-12-27T22:04:25.930 に答える
1

1 月が過ぎ、dbindexer は単純な JOINS をサポートするようになりました。ここで読むことができます:http://www.allbuttonspressed.com/blog/django/joins-for-nosql-databases-via-django-dbindexer-first-steps

すでに dbindexer を使用している場合は、次のような方法でインデックスを登録するだけです。

# photo/dbindexes.py:

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

register_index(Event, {'site__region': StandardLookup(),})
于 2011-06-07T23:51:58.740 に答える