我需要一个高度可扩展的数据库布局。我有一个超级“站”,它将具有唯一的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基础设施上是否可行?
答案 0 :(得分:0)
您正在做的是将财产表示为单独的实体。因此,您最终会得到几个不同的实体来表示引用父实体的属性(=属性)。
由于以下原因,这是不可行的:
您将无法通过多个属性查询实体。
如果您想以原子方式更改实体或其属性(添加/删除实体,添加/删除/更改属性),则必须将所有实体放入实体组并使用事务。
您需要使用查询来查找实体的属性,这是很昂贵的。
删除实体时,您需要手动查找所有属性实体并删除它们。
所以,总而言之,我不推荐这种方法。
解决方案:
GAE数据存储区是一个无模式数据库,这意味着您可以存储具有不同属性的相同类型的实体,例如有动态属性。问题出现了如何将动态属性映射到类。
在python中,您可以通过Expando class实现此目的。
在Java中,您可以使用low-level Entity class。低级API是最强大的,因为它公开了所有数据存储区功能,但在使用“无类型”实体类而不是模型类时使用起来很痛苦。
Objectify曾经有嵌入式地图,您可以在此向地图添加属性,最后它们将作为实体中的属性。他们在Objectify 3.1中的实现中发现了一个错误并且撤回了这个功能(=从文档中删除)。此功能will be back in Objectify 4尚未发布,但如果您有勇气,可以从主干构建它。