【发布时间】:2017-12-28 06:51:34
【问题描述】:
我使用 Google App Engine (Java) 作为我的 REST 后端,使用 google-datastore 作为数据库,并使用 objectify 来访问数据库。
我想创建一个单元实体来存储单元,其中一个单元可以是一个组件或一个组装单元,基本上一个组装单元由多个组件组成,并且还具有自己的一些属性。可以有多种类型的组装单元和多种类型的组件。 Entity 类类似于
public class UnitEntity {
Long unitId;
String serialNumber;
String state;
String unitType;
Long parentId;// -> this would be null for all assembled units and in case of components, if they are part of any assembled unit, it will be the Id of the assembled unit (This is added so that I can list all components of a particular assembled unit)
UnitParameters unitParameters;
}
这里的 UnitParameters 将是一个多态类,包含特定于单元类型的属性,也就是说,基于“unitType”的值,会有不同的类扩展“UnitParameters”。
假设其中一个组件(假设是component1,即unitType=component1)有一个名为modelNumber 的属性。此属性将存储在 unitType=component1 的所有实体的 unitParameters 中。
现在我希望能够列出 unitType=assembledUnit1 的单元,并且哪些单元具有 modelNumber 为 2.0 的子组件 1。
(我可以轻松获取 component1 类型的列表单元,其中 modelNumber 为 2.0 ,但我也希望能够获取父实体)
所以基本上在这里我试图通过过滤子实体的属性来获取父实体。 我想知道数据存储和物化是否可行?有没有办法实现这个功能?
更新 - 基于 @stickfigure 的回答的后续问题:
如果我使用 google cloud sql(基于 mysql)作为我的用例,那么我应该如何为我的数据建模?
我最初想为每个 unitType 设置一个表。假设有 3 个单元类型——assembledUnit1、assembledUnit2 和 component1。现在如果我想要一个列出每个单元的详细信息的 API,我该如何使用 cloud sql 来实现呢。
这是我可以使用数据存储区完成的事情,因为所有实体都属于相同的“种类”。
我显然可以有单独的 API 来列出所有类型为assembledUnit1、assembledUnit2 等的单元,但是我如何才能有一个可以列出所有单元的 API?
同样在这种方法中,如果有人调用 REST API GET /units/{unitId} ,我想我必须检查每个似乎不正确的表中的 unitId?
我想可以解决这个问题的一种方法是只有一个名为“Unit”的表,其列将是所有 unitTypes 列的超集。但是我认为这不是一种好的设计方式,因为每行都会有很多空列,而且如果添加了新的 unitType,架构也必须更改。
【问题讨论】:
标签: google-app-engine database-design google-cloud-datastore google-cloud-sql objectify