appengine はすでにスキーマレスですが、永続化レイヤーDatastore
を介してに格納する必要があるエンティティを定義する必要があります。Datanucleus
だから私はこれを回避する方法を考えています。コンパイル時のエンティティではなく、実行時にキー値を格納するレイヤーを持つことによって。
これを Redis で行う方法は、次のようなキーを作成することです。
private static final String USER_ID_FORMAT = "user:id:%s";
private static final String USER_NAME_FORMAT = "user:name:%s";
ドキュメントから Redisの種類は次String
のとおりLinked-list
です。もっとあるかどうかはわかりません。Set
Sorted set
GAEデータストアに関しては、文字列の「キー」と「値」が格納されるエンティティである必要があります。
お気に入り:
public class KeyValue {
private String key;
private Value value; // value can be a String, Linked-list, Set or Sorted set etc.
// Code omitted
}
このスキームの正当性は、データストアへの Restful アクセス (Datanucleus-api-rest によって提供される) に根ざしています。
この REST API を使用して、オブジェクトまたはエンティティを永続化します。
POST http://datanucleus.appspot.com/dn/guestbook.Greeting
{"author":null,
"class":"guestbook.Greeting",
"content":"test insert",
"date":1239213923232}
このアプローチの問題は、エンティティを永続化するために、実際のクラスをコンパイル時に定義する必要があることです。キー値ストア メカニズムを持つという考えとは異なり、メソッド呼び出しを単純化できます。
POST http://datanucleus.appspot.com/dn/org.myframework.KeyValue
{ "class":"org.myframework.KeyValue"
"key":"user:id:johnsmith;followers",
"value":"the_list",
}
単一の文字列を「値」として渡すのはかなり簡単です。リスト、セット、またはソートされたリストに JSON 配列を使用できます。本当の問題は、インターフェイスに渡されたさまざまなタイプのデータを実際に永続化する方法です。それぞれがサポートする基本型を表す複数の KeyValue エンティティが存在する必要があります: KeyValueString? キー値リスト? 等