我有一个学生实体,它已经有大约 12 个字段。现在,我想再添加 12 个字段(都与他的学术细节有关)。我应该标准化(一对一)并将其存储在不同的实体中还是应该我继续只在学生实体中添加信息。我正在使用 gaesession 将登录的用户存储在内存中
session = get_current_session()
session['user'] = user
这会影响应用程序的读写性能/成本吗?在内存缓存(FE 实例)中存储实体的成本是否与存储在实体中的属性数量有关?
我有一个学生实体,它已经有大约 12 个字段。现在,我想再添加 12 个字段(都与他的学术细节有关)。我应该标准化(一对一)并将其存储在不同的实体中还是应该我继续只在学生实体中添加信息。我正在使用 gaesession 将登录的用户存储在内存中
session = get_current_session()
session['user'] = user
这会影响应用程序的读写性能/成本吗?在内存缓存(FE 实例)中存储实体的成本是否与存储在实体中的属性数量有关?
这取决于需要从数据存储中检索这两组数据的频率。作为 GAE 的一般原则,您应该对数据进行反规范化,因此在您的情况下将所有属性存储在同一模型中。这会在您存储实体时导致更多的写入操作,但会减少获取和查询操作。
Memcache 不计费,因此您不必担心 Memcache 成本。此外,如果您使用ndb(我建议您这样做),则会自动处理 memcache 中的缓存。
通常,写入两个实体或获取两个实体的成本将大于写入或获取单个实体的成本。
写入成本与索引字段的数量相关。如果您要添加索引字段,那么每当修改这些字段时都会增加写入成本。如果未修改索引字段并且不需要更新索引,则不会产生更新该索引的成本。您也无需为实体的大小付费,因此从成本的角度来看,坚持使用单个实体会更便宜。
性能有点复杂。性能将受到 1) 查询开销和 2) 您正在获取的实体大小的影响。
如果您有两个实体,您将遭受双倍的查询开销,因为您可能必须查询/获取基础学生实体,然后为第二个实体发出第二个查询/获取。如果您能够通过 id 异步获取两个实体,则可能有某些方法可以解决此问题。但是,如果您需要查询,那么每当您需要查询第二个实体时,您的性能可能会受到影响。
另一方面,性能与实体大小成负相关。获取 100 个 1MB 实体将比获取 100 500 字节实体花费更长的时间。如果您的额外数据很大,并且您通常一次查询多个学生实体,然后将额外数据存储在一个单独的实体中,这样基本的学生实体就很小,您可以在不需要的情况下显着提高性能第二个实体。
总体而言,为了提高性能,您应该考虑您的数据访问模式,并尽量减少针对常见提取情况的无关数据提取。即,如果您倾向于一次只获取一个学生,并且您几乎总是需要该学生的所有数据,那么它不会影响您加载所有数据的成本。
但是,如果您通常拉出许多学生的列表,并且很少使用单个学生的完整数据,并且数据很大,您可能需要拆分实体。
此外,@CarterMaslan 的评论是错误的。您可以支持事务更新。如果您将部分数据放在单独的实体中,则同步实际上会更加复杂。在这种情况下,您需要确保两个实体之间有一个共同的祖先来执行事务操作。