AppEngine数据库布局,易于扩展

时间:2012-03-16 17:29:16

标签: database google-app-engine database-design

我需要一个高度可扩展的数据库布局。我有一个超级“站”,它将具有唯一的ID和多个属性。

station {
    unique_identifier: id
    ...
}

大多数属性都是这样的

station_attribute_item {
    referenced_station: id,
    value: double,
    date: date
}

因此,您可以将属性可视化为具有日期成员和值的列表项。

因此,如果我需要一个新属性,我会添加一个新类,就是这样吗?我所要做的就是查询新属性?

new_station_attribute {
    referenced_station: id
    value1: string
    value2: double
    start: date
    end: date
}

编辑:

这种数据布局在AppEngine基础设施上是否可行?

1 个答案:

答案 0 :(得分:0)

您正在做的是将财产表示为单独的实体。因此,您最终会得到几个不同的实体来表示引用父实体的属性(=属性)。

由于以下原因,这是不可行的:

  1. 您将无法通过多个属性查询实体。

  2. 如果您想以原子方式更改实体或其属性(添加/删除实体,添加/删除/更改属性),则必须将所有实体放入实体组并使用事务。

  3. 您需要使用查询来查找实体的属性,这是很昂贵的。

  4. 删除实体时,您需要手动查找所有属性实体并删除它们。

  5. 所以,总而言之,我不推荐这种方法。

    解决方案:

    GAE数据存储区是一个无模式数据库,这意味着您可以存储具有不同属性的相同类型的实体,例如有动态属性。问题出现了如何将动态属性映射到类。

    在python中,您可以通过Expando class实现此目的。

    在Java中,您可以使用low-level Entity class。低级API是最强大的,因为它公开了所有数据存储区功能,但在使用“无类型”实体类而不是模型类时使用起来很痛苦。

    Objectify曾经有嵌入式地图,您可以在此向地图添加属性,最后它们将作为实体中的属性。他们在Objectify 3.1中的实现中发现了一个错误并且撤回了这个功能(=从文档中删除)。此功能will be back in Objectify 4尚未发布,但如果您有勇气,可以从主干构建它。