基于非关系型数据库中的外键属性进行过滤的最佳实践是什么?我知道缺乏join
支持会使事情变得更复杂,所以我想知道其他人是如何解决它的。
就我而言,我有属于区域的属于区域的事件。我想过滤给定区域中的所有事件。 Event
具有site
属性,该属性是Site
的外键,后者又具有region
的{{1}}外键:
Region
这不起作用,因为site__区域需要region = Region.objects.get(id=regionID)
events = Event.objects.filter(site__region=region)
,并且在Google App Engine上运行的django-nonrel不支持。 (我将join
视为错误。)因此,我一直在迭代事件,添加与列表匹配的事件:
Caught DatabaseError while rendering: This query is not supported by the database.
这是做事的好方法吗?有什么傻事我忽略了吗?提前谢谢!
答案 0 :(得分:8)
这是一个非常低效的解决方案,因为您取消引用站点和区域,导致大量查询。这不会扩展到数据库中可能超过100个事件。
最佳解决方案是通过复制例如非常规化您的数据。将该区域的id转换为save()上的Event。然后你可以直接做Event.objects.filter(region_id = regionID)。生成的代码变得不那么干净和可维护,但这就是非关系数据库的工作方式,今天。
我现在可以说的是:如果可以,请等到1月底。 ;)
答案 1 :(得分: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(),})