我是否应该将实体规范化为gae中的一对一关系模型

时间:2013-07-14 06:06:27

标签: google-app-engine google-cloud-datastore

我有一个学生实体已经有大约12个字段。现在,我想再添加12个字段(都与他的学术细节有关)。我应该规范化(一对一)并将其存储在不同的实体或我应该继续只在学生实体中添加信息。 我正在使用gaesession将登录用户存储在内存中

session = get_current_session()
session['user'] = user

这会影响应用的读写性能/成本吗?在memcache(FE实例)中存储实体的成本是否与存储在实体中的属性数相关?

2 个答案:

答案 0 :(得分:1)

这取决于这两个"设置的频率。需要从数据存储中检索数据。作为GAE中的一般原则,您应该对数据进行去规范化,因此在您的情况下,将所有属性存储在同一模型中。这样,在存储实体时将导致更多的写操作,但会减少get和query操作。

Memcache不是可计费的,因此您不必担心内存缓存成本。此外,如果您使用ndb(我建议您这样做),则会自动处理内存缓存中的缓存。

答案 1 :(得分:1)

通常,编写两个实体或获取两个实体的成本将大于写入或获取单个实体的成本。

写入成本与索引字段的数量相关联。如果要添加索引字段,则只要修改这些字段,就会增加写入成本。如果未修改索引字段且不需要更新索引,则不会产生更新该索引的成本。您也没有对实体的规模收费,因此从成本角度来看,坚持使用单个实体会更便宜。

性能有点复杂。性能将受到1)查询开销和2)您正在获取的实体的大小的影响。

如果您有两个实体,那么您将遭受双倍的查询开销,因为您可能必须查询/获取基础学生实体,然后为第二个实体发出第二个查询/获取。如果您能够异步地通过id获取两个实体,则可能存在某些方法。如果你需要查询,那么当你需要查询第二个实体时,你的perf可能会受到影响。

另一方面,perf与实体大小呈负相关。获取100个1MB实体将比获取100个500字节实体花费更长的时间。如果您的额外数据很大,并且您通常一次查询许多学生实体,那么将额外数据存储在一个单独的实体中,使基本学生实体很小,您可以在不需要的情况下显着提高性能第二个实体。

总的来说,为了提高性能,您应该考虑数据访问模式,并尽量减少针对常见提取情况的无关数据提取。也就是说,如果您倾向于一次只取一个学生,并且您几乎总是需要该学生的所有数据,那么它不会影响您加载所有数据的成本。

但是,如果您通常提取许多学生的列表,并且很少使用单个学生的完整数据,并且数据很大,您可能希望拆分实体。

此外,@ CartelMaslan的评论是错误的。您可以支持事务更新。如果您将数据的一部分放在不同的实体中,那么同步实际上会更复杂。在这种情况下,您需要确保在两个实体之间有一个共同的祖先来进行事务操作。