0

RESTバックエンドにGoogle App Engine(Java)を使用し、データベースとしてgoogle-datastoreを使用し、objectifyを使用してデータベースにアクセスしています。データストアの子エンティティのプロパティを使用して親エンティティをフィルタする方法

単位を構成要素または組み立て単位とすることができるユニットを格納する単位エンティティを作成したいと考えています。基本的には、複数のコンポーネントで構成され、独自のプロパティもいくつかあります。複数のタイプの組み立てられたユニットと複数のタイプのコンポーネントがあります。 EntityクラスはUnitParametersが広がる異なるクラスが存在することになる、「UNITTYPE」の値に基づいて、つまり、単位のタイプに固有のプロパティを格納するための多型クラスでしょう。ここ

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"。

コンポーネント(つまり、componentType = component1)には、modelNumberというプロパティがあります。このプロパティはunitType = component1のすべてのエンティティのunitParametersに格納されます。

ここで、unitType = assembledUnit1のユニットをリストすることができ、modelNumberが2.0の子コンポーネント1を持つユニットをリストできます。

(私は簡単にmodelNumberが2.0であるタイプのコンポーネント1のリストの単位を取得することができますが、私はまた、親エンティティを取得できるようにしたい)

だから、基本的にここで私が上でフィルタリングすることにより、親エンティティを取得しようとしています子供の特性。 これはデータストアで可能でオブジェクト化できるかどうかを知りたいですか?この機能を実現する方法はありますか?

アップデート - @stickfigureによって回答に基づいて、フォローアップの質問:

私は私のユースケースのために(mysqlのに基づいている)GoogleのクラウドSQLで行く場合、どのように私は私のデータをモデル化する必要があります?

私は当初、各ユニットタイプのテーブルを持っていると考えました。 3つのunitTypes - assembledUnit1、assembledUnit2およびcomponent1の3つがあるとします。今、各ユニットの詳細をリストアップしたAPIが必要な場合は、クラウドSQLでどのようにこれを実現できますか?

これは、すべてのエンティティが同じ「種類」のデータストアであるため、データストアで行うことができたことです。

assembledUnit1、assembledUnit2などのすべてのユニットをリストするために別々のAPIを使用することはできますが、どのようにすべてのユニットをリストできる単一のAPIを持つことができますか?

また、誰かがREST API GET/units/{unitId}を呼び出すと、正しくないと思われる各テーブルのunitIdを確認する必要があると思いますか?

これを解決できる方法は、すべてのunitTypesの列のスーパーセットになる「Unit」という1つのテーブルを持つことです。しかし、これは、各行に空の列がたくさんあり、新しいunitTypeが追加された場合にスキーマを変更する必要があるため、これは設計の良い方法ではないと思います。

答えて

1

データストアは結合を行いません。したがって、2つのオプション、1)フェッチによる自分自身の参加、または2)親データへの子データの一部の非正規化、およびそこへのインデックス作成のいずれかのオプションがあります。どの戦略が最も効果的かは、データの形状とパフォーマンス/コストの考慮事項によって異なります。

「検索APIやRDBMSなど、別の種類のデータベースにデータの一部の外部インデックスを保存する」という3番目のオプションが追加されています。

これは必ずしも満足できる答えではありません.RDBMSで結合や集計を行う機能は非常に便利です。適度なサイズ/トラフィック/信頼性の要件を持つ高いリレーショナルデータがある場合は、代わりにCloud SQLのようなものを使用することができます。

+0

お返事ありがとうございます。質問に更新した回答に基づいていくつか追加の質問があります –

関連する問題