去标准化数据模型:django / sql - >应用引擎

时间:2011-11-09 15:05:23

标签: database django google-app-engine data-modeling denormalization

我刚刚开始关注非关系型数据库,所以我想请求帮助将这些传统的SQL / django模型转换为Google App Engine模型。

该示例适用于活动列表,其中每个活动都有一个类别,属于一个场地,并且场地附有许多照片。

在django中,我会像这样建模数据:

class Event(models.Model)
    title = models.CharField()
    start = models.DatetimeField()
    category = models.ForeignKey(Category)
    venue = models.ForeignKey(Venue)

class Category(models.Model):
    name= models.CharField()

class Venue (models.Model):
    name = models.CharField()
    address = models.CharField()

class Photo(models.Model):
    venue = models.ForeignKey(Venue)
    source = models.CharField()

我如何使用App Engine模型完成等效工作?

2 个答案:

答案 0 :(得分:1)

这里没有任何必须去规范化才能使用App Engine。您可以将ForeignKey更改为ReferenceProperty,将CharField更改为StringProperty,将DatetimeField更改为DateTimeProperty并完成。将类别存储为字符串而不是引用可能更有效,但这取决于使用情况。

当您开始设计查询时,非规范化变得很重要。与传统SQL不同,您无法编写可访问每个表的每一行的即席查询。您要查询的任何内容都必须由索引满足。如果您今天运行依赖于表扫描和复杂连接的查询,则必须确保查询参数在写入时编制索引,而不是动态计算它们。

例如,如果您希望按事件标题进行不区分大小写的搜索,则必须在写入时在每个实体上存储标题的小写副本。在不猜测您的查询要求的情况下,我无法提供更具体的建议。

答案 1 :(得分:0)

可以在App Engine上运行Django

您需要从这里获得三个应用程序: http://www.allbuttonspressed.com/projects

  • Django的nonrel
  • djangoappengine
  • djangotoolbox

此外,此模块可以跨数据存储区方法不直接支持的外键关系进行连接:

  • 的django-dbindexer

...它会对要加入的字段进行非规范化,但有一些限制 - 不会自动更新非规范化值,因此只适用于静态值

Django信号为自动非规范化提供了一个有用的起点。