根据非关系数据库中外国密钥的属性过滤的最佳实践是什么?我了解缺乏 join 支持使事情变得更加复杂,因此我想知道其他人是如何解决的。

就我而言,我有属于区域的网站的事件。我想过滤给定区域中的所有事件。一个 Event 有个 site 财产是一个外国钥匙 Site, ,这又有一个 region 外国钥匙 Region:

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

这是行不通的,因为站点__ Rengion需要一个 join 这在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)

这是做事的好方法吗?我忽略了一些愚蠢的东西吗?提前致谢!

有帮助吗?

解决方案

这是一个非常低效的解决方案,因为您取消站点和区域会引起很多查询。这不会超出您的DB中的100个事件。

最好的解决方案是通过将区域的ID复制到save()上的事件中来使您的数据义。然后,您可以直接执行event.objects.filter(region_id = regionId)。最终的代码变得更加干净和可维护,但这就是事物在非关系DB上的工作方式, 今天.

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

其他提示

一月已经过去了,dbIndexer现在支持简单的连接。您可以在这里阅读: 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(),})
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top