GAE:如何有效地将面向对象的设计映射到Appengine数据存储区

时间:2012-02-14 14:41:06

标签: java google-app-engine

让我们假设我有以下对象模型(你可以自由地改变它,我的兴趣只是有效地映射),

public class Product{
    private String someAttribute;
    //...
}

// A Seller who has a lot of products to sell, More than one Seller can sell the same Product
public class Seller{
    private List<Product> products;
    //...
}

public class Offer{
    // who is offering
    private Seller seller;
    // multiple products can make an offer
    private List<Product> products;
    // pricing related
    private Price price;
    //...
}

我想编写一个网络应用程序,它将对这些对象执行,读/写/搜索,并认为输入点可以是其中任何一个。

以下是我的疑问 -

  1. 我将使用什么样的设计模式?我想某种适配器模式?
  2. 在存储Seller对象时,我是否应该存储Product对象的引用?还是只是钥匙?我的意思是我应该将Seller类转换为以下内容,

    公共类卖家{     私人清单productKeys; }

  3. 如果我想编写一个可扩展且可维护的应用程序,我认为应该有一些很好的方法在分层架构中设计我的应用程序。是否有一些例子或一些已经使用过的模式?例如某种JSP - &gt;服务 - &gt; DAO - &gt;数据存储 ?非常感谢。

  4. 我也通过了AppEngineSDK for java,但没有找到相同的例子。真的很感激帮助答案或指点。

2 个答案:

答案 0 :(得分:9)

对于NoSQL数据库(例如GAE数据存储区),您应该考虑数据访问模型,而不是数据存储模型。即您应该考虑如何访问数据以及如何组织数据以便最有效地访问(=更快,更便宜)。

不幸的是,这经常违背OOP原则和数据存储“架构”(没有数据存储架构,你意识到,不是吗?)不适合Java OOP范例。

实现这一目标的一种方法是对数据进行反规范化,这意味着您将数据(尽可能多地)写入一个大记录中,这也意味着数据是多余的。

现在,由于您无法将所有数据放在一条记录中,因此您需要做出几个让步。要做到这一点,你必须决定:

  1. 最常阅读哪些数据?
  2. 哪些数据最常更改?
  3. 从您的模型中我猜测产品&amp;卖家不会改变很多,但会经常创建Offer,对吧?尝试进行设计,以便最大限度地减少读/写次数 - 从最常用的数据开始,然后组织模式,以便以最少的读/写次数获取/放置大部分数据。

    试着回答你的问题:

    1. 只需创建您的服务层,您可以在其中执行基本的CRUD功能(添加/更新/删除/查找卖方/产品/等)和更高级别的业务功能(为卖方提供产品优惠等)。 。 DAO是PITA,因此您应尽可能尝试使用POJO - 使用Objectify。在这种情况下,您可以取消适配器模式。

    2. 如果引用你的意思是ID(长,长或字符串),那么你应该使用密钥:密钥是父密钥,种类和ID的组合。密钥保证是唯一的,而ID不是(仅当您不使用实体组时它们才是唯一的)。此外,通过客观化,键是类型安全的,而ID不是。

    3. 如1所述,分层方法是要走的路。尽量避免使用DAO - 它们需要大量的手工工作,因此是错误的来源。

答案 1 :(得分:3)

我会看一下objectify:http://code.google.com/p/objectify-appengine/

一般来说,在appengine中使用数据访问的经验法则是避免尽可能多的“连接”。从单个表中获取大型(甚至是大量)数据集在外观上非常便宜,但是从许多较小的相关数据源获取是非常昂贵的。因此,在您的示例中,您可以考虑将产品作为嵌入式集合存储在卖家表中,如果您可以放弃这样做。

HTH

瑞克