我正在使用Google App Engine(Java)作为我的休息后端,而Google-datastore作为数据库,并使用Objectify访问数据库。
我想创建一个单元实体来存储单元可以是组件或组装单元的单位,基本上是由组件组成的组件组成的,并且具有自己的某些属性。可以有多种类型的组装单元和多种类型的组件。实体类将是
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;
}
这里的单位参数将是一个多态性类,包含特定于单位类型的属性,即基于" Unitepe"的值,将有不同的类扩展" Unitparameters"。
让我们假设一个组件(例如,component1,即Unittepe = Component1)具有称为ModelNumber的属性。该属性将存储在Unitsepe = Component1。
的所有实体的单位参数中。现在,我希望能够列出UNITTYPE = assembleDunit1且具有一个component1的单元。
(我可以轻松获取类型Component1的列表单位,其中ModelNumber为2.0,但我也希望能够获得父实体)
)基本上,我试图通过过滤儿童的特性来获取父实体。我想知道数据存储和客观化是否可以吗?有什么方法可以实现此功能?
更新 - 基于@StickFigure答案的后续问题:
如果我使用Google Cloud SQL(基于MySQL)的用例,那么我应该如何建模数据?
我最初想到每个Unitsepe都有一个表。假设有3个Unitespes -sedbleDunit1,assembleDunit2和component1。现在,如果我想拥有一个列出每个单元详细信息的API,我该如何使用CloudSQL。
来实现此目标。这是我可以在数据存储中完成的事情,因为所有实体都是相同的"类型"。
我显然可以拥有单独的API来列出类型AssembleDunit1,AssembledUnit2等的所有单元,但是我如何拥有一个可以列出的单个API可以列出所有单元?
也在这种方法中,如果有人调用REST API获取/{unitId},我想我必须在每个表中的单位中检查单位diTID吗?
我想可以解决此问题的一种方式是只有一个称为"单位"的表,其列将是所有Untytypes的列的超集。但是,我认为这不是一个很好的设计方法,因为每行将有很多空列,并且如果添加新的Unitsepe,则必须更改模式。
数据存储不会加入。因此,您要有两个选项,要么1)通过获取或2)将某些子数据不合同时地将父母置于父母并在此处索引。哪种策略最有效的方法会根据您的数据形状和性能/成本注意事项而有所不同。
我应该添加第三个选项,该选项是"将某些数据的外部索引存储在另一种数据库中,例如搜索API或RDBMS"。
这并不总是一个非常令人满意的答案 - 在RDBMS中进行加入和聚集的能力非常有用。如果您具有高度的大小/流量/可靠性要求,则可能需要使用云SQL之类的东西。