Java 开发 2.0: NoSQL
2010-07-20 00:00:00 来源:WEB开发网通过 Shards 伸缩
Sharding是一种分区形式,它将一个表结构复制到多个节点,但逻辑上在各节点之间划分数据。例如,一个节点可以拥有驻留在美国的帐户的所有相关数据,而另一个节点则针对驻留在欧洲的所有帐户。但如果节点拥有关系 —即跨 Shard 联接,Shards 就会出现问题。这是一个棘手的问题,在很多情况下都无法解决。
无模式数据存储的好处之一是无须事先知道所有事情,也就是说,与使用关系数据库架构相比,可以更轻松地适应变化。(注意,我并非暗示不能更改架构;我只是说,可以更轻松地适应变化。)我不打算定义我的域对象上的属性 —我将其推迟到 Groovy 的动态特性(实际上,这个特性允许创建针对 Google 的 Entity对象的域对象代理)。相反,我将把我的时间花费在确定如何查找对象并处理关系上。这是 NoSQL 和各种利用无模式数据存储的框架还没有内置的功能。
Model 基类
我将首先创建一个基类,用于容纳 Entity对象的一个实例。然后,我将允许一些子类拥有一些动态属性,这些动态属性将通过 Groovy 的方便的 setProperty方法添加到对应的 Entity实例。setProperty针对对象中实际上不存在的任何属性设置程序调用。(如果这听起来耸人听闻,不用担心,您看到它的实际运行后就会明白。)
清单 2 展示了位于我的示例应用程序的一个 Model实例的第一个 stab:
清单 2. 一个简单的 Model 基类
package com.b50.nosql
import com.google.appengine.api.datastore.DatastoreServiceFactory
import com.google.appengine.api.datastore.Entity
abstract class Model {
def entity
static def datastore = DatastoreServiceFactory.datastoreService
public Model(){
super()
}
public Model(params){
this.@entity = new Entity(this.getClass().simpleName)
params.each{ key, val ->
this.setProperty key, val
}
}
def getProperty(String name) {
if(name.equals("id")){
return entity.key.id
}else{
return entity."${name}"
}
}
void setProperty(String name, value) {
entity."${name}" = value
}
def save(){
this.entity.save()
}
}
更多精彩
赞助商链接