让我们假设我有以下对象模型(你可以自由地改变它,我的兴趣只是有效地映射),
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;
//...
}
我想编写一个网络应用程序,它将对这些对象执行,读/写/搜索,并认为输入点可以是其中任何一个。
以下是我的疑问 -
在存储Seller对象时,我是否应该存储Product对象的引用?还是只是钥匙?我的意思是我应该将Seller类转换为以下内容,
公共类卖家{ 私人清单productKeys; }
如果我想编写一个可扩展且可维护的应用程序,我认为应该有一些很好的方法在分层架构中设计我的应用程序。是否有一些例子或一些已经使用过的模式?例如某种JSP - &gt;服务 - &gt; DAO - &gt;数据存储 ?非常感谢。
我也通过了AppEngineSDK for java,但没有找到相同的例子。真的很感激帮助答案或指点。
答案 0 :(得分:9)
对于NoSQL数据库(例如GAE数据存储区),您应该考虑数据访问模型,而不是数据存储模型。即您应该考虑如何访问数据以及如何组织数据以便最有效地访问(=更快,更便宜)。
不幸的是,这经常违背OOP原则和数据存储“架构”(没有数据存储架构,你意识到,不是吗?)不适合Java OOP范例。
实现这一目标的一种方法是对数据进行反规范化,这意味着您将数据(尽可能多地)写入一个大记录中,这也意味着数据是多余的。
现在,由于您无法将所有数据放在一条记录中,因此您需要做出几个让步。要做到这一点,你必须决定:
从您的模型中我猜测产品&amp;卖家不会改变很多,但会经常创建Offer,对吧?尝试进行设计,以便最大限度地减少读/写次数 - 从最常用的数据开始,然后组织模式,以便以最少的读/写次数获取/放置大部分数据。
试着回答你的问题:
只需创建您的服务层,您可以在其中执行基本的CRUD功能(添加/更新/删除/查找卖方/产品/等)和更高级别的业务功能(为卖方提供产品优惠等)。 。 DAO是PITA,因此您应尽可能尝试使用POJO - 使用Objectify。在这种情况下,您可以取消适配器模式。
如果引用你的意思是ID(长,长或字符串),那么你应该使用密钥:密钥是父密钥,种类和ID的组合。密钥保证是唯一的,而ID不是(仅当您不使用实体组时它们才是唯一的)。此外,通过客观化,键是类型安全的,而ID不是。
如1所述,分层方法是要走的路。尽量避免使用DAO - 它们需要大量的手工工作,因此是错误的来源。
答案 1 :(得分:3)
我会看一下objectify:http://code.google.com/p/objectify-appengine/
一般来说,在appengine中使用数据访问的经验法则是避免尽可能多的“连接”。从单个表中获取大型(甚至是大量)数据集在外观上非常便宜,但是从许多较小的相关数据源获取是非常昂贵的。因此,在您的示例中,您可以考虑将产品作为嵌入式集合存储在卖家表中,如果您可以放弃这样做。
HTH
瑞克