0

尝试在应用引擎中对一些高度连接但也有层次的数据进行建模。

这是一个例子:

Person:
    Phone Numbers:
        Number: 555-555-5555, Ext: 123, Notes: Work
        Number: 444-444-4444, Ext: 456, Notes: Mobile

一个实体,包含存储为 JSON blob 的数据结构:

一种方法是将phone_numbers集合存储为 JSON 文本的未索引 blob,然后添加搜索属性,以便可以通过电话号码查询人员:

p_entity = Person()

p_entity.phone_numbers = dbText(simplejson.dumps([{'Number':'555-555-5555', 'Ext':'123', 'Notes':'Work'},{'Number':'444-444-4444', Ext:'456', Notes:'Mobile'}]))
p_entity.phone_numbers_search_property = ['5555555555', '4444444444']

p_entity.put()

具有父子关系的多个实体:

另一种方法是使用子实体和父实体:

person_entity = Person()
person_entity.put()

phone_entity1  = PhoneNumber(parent=person_entity)
phone_entity.Number = '5555555555'
phone_entity.Ext    = '123'
phone_entity.Notes  = 'Work'

phone_entity2  = PhoneNumber(parent=person_entity)
phone_entity.Number = '4444444444'
phone_entity.Ext    = '456'
phone_entity.Notes  = 'Mobile'

一个用例:

这是高度关联的数据。一个人对象包含多个电话号码。但也可以拨打这些电话号码或从这些电话号码拨打电话。电话记录也需要参考这些电话号码。

父子实体关系的目的:

阅读文档后,我的印象是父子实体关系的目的是执行交易。

但是,在这种情况下它们是否也适用?将父级及其所有子级从数据存储中拉出与将一个实体与其“子级”拉出而不是存储为 JSON 文本 blob 一样有效吗?

基本问题

在谷歌应用引擎中是否有一种正常且可接受的方式来处理此类数据?

4

2 回答 2

2

看看新的 NDB API(特别是 StructuredProperty:http ://code.google.com/appengine/docs/python/ndb/properties.html#structured )

另外,根据我的经验和阅读的内容,当您更新现有实体时,您无需为未更改的属性的写入付费,也就是说,与 Riley 所说的相反,您只需为写入对象付费+ 2 次写入已修改的任何索引属性 + 1 次写入您拥有的包含您修改的模型和属性的每个复合索引。

根据我读过的所有文章和我的经验(我也不得不为此想出一个解决方案并最终使用 JSON 方法),您希望尽可能多地打包到一个实体中,以尽量减少访问数据存储的次数就 $$ 和时间而言,这是最昂贵的。

于 2012-03-12T17:30:14.680 回答
1

将子实体拉出数据存储并没有特别的好处。如果您get是两个实体,则无论它们是否在同一个实体组中,成本都是相同的。应用引擎中实体组的唯一目的是事务。

当电话号码更改时,您的电话记录是否应该更改?我最初的想法是记录应该有电话号码数据的单独副本,而不是对电话号码对象的引用。您仍然可以通过电话号码查询通话记录。存储对所涉及的联系人的引用更有意义,这样如果他们的姓名发生变化或发生某些事情,可以更新通话记录。

于 2012-03-12T15:54:29.333 回答