2012-03-16 6 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上で実行可能かどうか尋ねていますか?そうです。アプリケーションに適したレイアウトかどうかは、このデータをどのように使用するかによって異なります。 –

+0

あなたは正しいです、その質問は何とか十分正確ではありません。 – Friedrich

答えて

0

あなたがやっていることは、プロパティを別のエンティティとして表現することです。つまり、親エンティティを参照するプロパティ(=属性)を表すいくつかの異なるエンティティになります。

これは次の理由のために現実的ではありません。

  1. あなたはいくつかのプロパティを介してエンティティを照会することができません。

  2. エンティティまたはそのプロパティ(エンティティの追加/削除、プロパティの追加/削除/変更)をアトミックに変更するには、それらをすべてエンティティグループに入れてトランザクションを使用する必要があります。

  3. エンティティのプロパティを検索するためにクエリを使用する必要がありますが、コストがかかります。

  4. エンティティを削除すると、すべてのプロパティエンティティを手動で検索して削除する必要があります。

このように、私はこのアプローチをお勧めできません。

ソリューション:

GAEデータストアは、あなたが、例えば、異なる特性を持つ同じ種類のエンティティを格納できることを意味し、スキーマレスデータベースです動的な特性を有する。動的プロパティをクラスにマップする方法が問題になります。

pythonではExpando classでこれを達成できます。

Javaでは、low-level Entity classを使用できます。低レベルのAPIは、Datastoreのすべての機能を公開しているので最も強力ですが、モデルクラスではなく「タイプレス」Entityクラスで作業する際に苦労します。

このマップにプロパティを追加すると、プロパティがエンティティとして追加されます。彼らはObjectify 3.1の実装でエラーを発見し、この機能を取り消しました(=ドキュメントから消えました)。この機能はまだリリースされていないwill be back in Objectify 4ですが、あなたが勇気づけば、トランクから構築することができます。

関連する問題