mon*_*oni 4 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;
//...
}
Run Code Online (Sandbox Code Playgroud)
我想编写一个Web应用程序,它将对这些对象执行,读/写/搜索,并考虑入口点可以是其中任何一个.
以下是我的疑问, -
在存储Seller对象时,我是否应该存储Product对象的引用?还是只是钥匙?我的意思是我应该将Seller类转换为以下内容,
公共类别卖方{private List productKeys; }
如果我想编写一个可扩展且可维护的应用程序,我认为应该有一些很好的方法在分层架构中设计我的应用程序.是否有一些例子或一些已经使用过的模式?例如某种JSP - >服务 - > DAO - > dataStore?实例将非常感激.
我也浏览了AppEngineSDK for java,但没有找到相同的例子.真的很感激帮助答案或指针.
使用NoSQL数据库(例如GAE数据存储区),您应该考虑数据访问模型,而不是数据存储模型.也就是说,您应该考虑如何访问数据以及如何组织数据,以便最有效地访问(=更快,更便宜).
不幸的是,这经常违背OOP原则和数据存储"架构"(没有数据存储架构,你意识到,不是吗?)不适合Java OOP范例.
实现这一目标的一种方法是对数据进行去标准化,这意味着您在一个大记录中写入数据(尽可能多),这也意味着数据是多余的.
现在,由于您无法将所有数据放在一个记录中,因此您需要做出几个让步.要做到这一点,你必须决定:
从您的模型中我猜测产品和卖家不会有太大变化,但会经常创建优惠,对吗?尝试进行设计,以便最大限度地减少读/写次数 - 从最常用的数据开始,然后组织模式,以便以最少的读/写次数获取/放置大部分数据.
试着回答你的问题:
只需创建您的服务层,您可以在其中执行基本的CRUD功能(添加/更新/删除/查找卖方/产品/等)和更高级别的业务功能(为卖方提供产品优惠等).DAO是PITA,因此您应尽可能尝试使用POJO - 使用Objectify.在这种情况下,您可以取消适配器模式.
如果引用你的意思是ID(长,长或字符串),那么你应该使用键:键是父键,种类和ID的组合.密钥保证是唯一的,而ID不是(仅当您不使用实体组时它们才是唯一的).此外,通过客观化,键是类型安全的,而ID不是.
如1.中所述,分层方法是要走的路.尽量避免使用DAO - 它们需要大量的手工工作,因此是错误的根源.