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

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

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 products; //... } public class Offer{ // who is offering private Seller seller; // multiple products can make an offer private List products; // pricing related private Price price; //... } 

我想编写一个Web应用程序,它将对这些对象执行,读/写/搜索,并考虑入口点可以是其中任何一个。

以下是我的疑问, –

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

    公共类别卖方{private List productKeys; }

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

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

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

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

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

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

  1. 哪个数据最多?
  2. 哪些数据最多会改变?

从您的模型中我猜测产品和卖家不会有太大变化,但会经常创建优惠,对吗? 尝试进行设计,以便最大限度地减少读/写次数 – 从最常用的数据开始,然后组织模式,以便以最少的读/写次数获取/放置大部分数据。

试着回答你的问题:

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

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

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

我会看看客观化: http : //code.google.com/p/objectify-appengine/

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

HTH

干草堆