3

在非关系数据库中基于外键属性进行过滤的最佳实践是什么?我知道缺乏join支持会使事情变得更加复杂,所以我想知道其他人是如何绕过它的。

就我而言,我有属于站点的事件,属于区域。我想过滤给定区域中的所有事件。AnEventsite属性是 a 的外键,而 aSite又具有 a 的region外键Region

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

这不起作用,因为 site__region 需要 ajoin并且在 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

这是一个非常低效的解决方案,因为您取消引用站点和区域,从而导致大量查询。这不会超过您数据库中的 100 个事件。

最好的解决方案是通过在 save() 上将区域的 id 复制到 Event 中来非规范化您的数据。然后可以直接做Event.objects.filter(region_id=regionID)。生成的代码变得不那么干净和可维护,但这就是今天在非关系数据库上工作的方式。

我现在只能说:如果可以的话,等到一月底。;)

于 2010-12-27T22:04:25.930 回答
1

January has gone and dbindexer now supports simple JOINS. You can read about here: http://www.allbuttonspressed.com/blog/django/joins-for-nosql-databases-via-django-dbindexer-first-steps

If you are already using dbindexer you should simply register your index using something like this:

# 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 回答