2012-03-16 77 views
0

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

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上的基础设施是否可行?

+2

你问这个布局在App Engine上是否可行?它是。它是否适合您的应用程序取决于您打算如何使用这些数据。 – 2012-03-16 19:08:00

+0

你说得对,问题在某种程度上不够精确。 – Friedrich 2012-03-17 07:46:09

回答

0

你在做什么是代表属性作为一个单独的实体。所以你最终会得到几个表示引用父实体的属性(=属性)的不同实体。

这是不可行的,原因如下:

  1. 您将无法查询实体在几个属性。

  2. 如果你想要原子地改变一个实体或它的属性(添加/删除实体,添加/删除/更改属性),你必须把它们放在一个实体组中并使用事务。

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

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

因此,总而言之,我不能推荐这种方法。

解决方案:

GAE数据存储是一种无结构的数据库,这意味着你可以存储相同类型具有不同性质的实体,例如具有动态特性。问题出现在如何将动态属性映射到类上。

在python中,你可以通过Expando class来实现。

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

Objectify用于嵌入地图,您可以在此地图中添加属性,并最终将其作为实体中的属性。他们在Objectify 3.1中发现了一个错误,并撤消了这个功能(=从文档中删除)。此功能will be back in Objectify 4尚未发布,但如果您觉得自己很勇敢,则可以从后备箱构建它。