0

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です。もっとあるかどうかはわかりません。SetSorted 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? キー値リスト? 等

4

3 に答える 3

1

Datanucleusは、GAE上で実行される特定のフレームワークです。ただし、データベースには、より低く、構造化されていない、よりキー/値に似たレベル(低レベルのAPI)でアクセスできます。これは、直接アクセスできる最低レベルです。ところで、低レベルの「GAEデータストア」は、6つのグローバルGoogle Megastoreテーブルで内部的に実行され、GoogleBigTableデータベースシステムでホストされます。JSONを文字列として保存すると正常に機能します。ただし、ID以外の方法でオブジェクトを取得する方法が必要になります。つまり、あらゆる種類の有用なクエリをサポートするために、データにインデックスを付ける方法が必要です。

于 2012-06-19T11:15:14.387 に答える
1

Datanucleus レイヤーやその他の細かい ORM レイヤー (Twig や Objectify など) を使用する必要はありません。これらはオプションであり、すべて低レベル API に基づいています。あなたの言っていることを正しく解釈すれば、あなたが望む機能をすでに備えているかもしれません。参照: https://developers.google.com/appengine/docs/java/datastore/entities

于 2012-06-18T21:12:29.353 に答える
1

JSON ベースの REST API を使用しているように見えますが、Value を JSON 文字列として保存してみませんか?

于 2012-06-18T19:23:12.983 に答える