如何使用数据存储区中子实体的属性筛选父实体

问题描述 投票:0回答:1

我使用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 = assembleUnit1的单元,以及具有modelNumber为2.0的子组件1。

(我可以很容易地获得component1类型的列表单元,其中modelNumber是2.0,但我希望能够获得父实体)

所以基本上我在这里尝试通过过滤子项的属性来获取父实体。我想知道数据存储和客观化是否可行?有没有办法实现这个功能?

更新 - 基于@stickfigure的答案的后续问题:

如果我使用google cloud sql(基于mysql)来处理我的用例,那么我应该如何建模我的数据呢?

我最初想过为每个unitType都有一个表。假设有3个unitTypes - assembleUnit1,assembleUnit2和component1。现在,如果我想要一个列出每个单元细节的API,我怎样才能通过cloud sql实现这一点。

这是我可以用数据存储区完成的,因为所有实体都具有相同的“类型”。

我显然可以使用单独的API来列出所有类型为assembleUnit1,assembleUnit2等的单元,但是如何才能列出可列出所有单元的单个API?

同样在这种方法中,如果有人调用REST API GET / units / {unitId},我想我必须在每个表中检查看起来不正确的unitId?

我想可以解决这个问题的一种方法是只有一个名为“Unit”的表,其列将是所有unitTypes列的超集。但是我不认为这是一种很好的设计方法,因为每行会有很多空列,如果添加了新的unitType,则必须更改模式。

google-app-engine database-design google-cloud-datastore google-cloud-sql objectify
1个回答
1
投票

数据存储区不进行连接。所以你有两个选项,1)通过提取自己加入或2)将一些子数据反规范化为父类并在那里索引它。哪种策略最有效将取决于数据的形状和性能/成本考虑因素。

我应该补充说,第三个选项是“将一些数据的外部索引存储在另一种数据库中,例如搜索API或RDBMS”。

这并不总是一个非常令人满意的答案 - 在RDBMS中进行连接和聚合的能力非常有用。如果您拥有具有适度大小/流量/可靠性要求的高度关系数据,则可能需要使用类似Cloud SQL的内容。

© www.soinside.com 2019 - 2024. All rights reserved.