0

Datastore虽然 appengine 已经是无模式的,但仍然需要通过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 数据存储,字符串“Key”和“Value”必须是要存储的实体。

像:

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

看起来您正在使用基于 JSON 的 REST API,那么为什么不将 Value 存储为 JSON 字符串呢?

于 2012-06-18T19:23:12.983 回答
1

您不需要使用 Datanucleus 层或任何其他精细的 ORM 层(如 Twig 或 Objectify)。这些是可选的,并且都基于低级 API。如果我正确地解释了您所说的内容,那么它可能已经具有您想要的功能。请参阅: https ://developers.google.com/appengine/docs/java/datastore/entities

于 2012-06-18T21:12:29.353 回答
1

Datanucleus 是一个在 GAE 之上运行的特定框架。但是,您可以在较低、结构较少、更像键/值的级别访问数据库 - 低级别 API。这是您可以直接访问的最低级别。顺便说一句,低级“GAE 数据存储”在内部运行在 6 个全球 Google Megastore 表上,这些表又托管在 Google Big Table 数据库系统上。将 JSON 保存为字符串可以正常工作。但是您将需要通过 ID 以外的方式来检索您的对象。也就是说,您需要一种方法来索引您的数据,以支持对其进行任何类型的有用查询。

于 2012-06-19T11:15:14.387 回答