我们正在使用couchbase构建项目。在Android上,我使用couchbase lite。通常,我一直在使用关系数据库,因为我是沙发基础新手,我无法找到“正确”的架构。我理解我认为的核心概念,但所有样本和指南似乎都坚持某种简单的设置,他们在活动中访问数据库。
我更习惯于拥有一些数据库抽象,其中业务逻辑只能看到通过数据库接口或某些DAO或其他东西传递的POJO DTO。所以我现在已经注释了我的模型类,并开始编写一个简单的OR映射器,但是使用不同类型的数据,外键等等,这会非常快速地耗费时间。
我是否完全忽略了这一点?我无法想象每个人都这样做吗?我每个人都在编写将文档单独转换为每个类的POJO模型类的方法吗?或者使用json解析器来做到这一点(但如果我不想加载外键那么这对外键不起作用,是吗?)
很抱歉问题很多,但我觉得我错过了一些明显的问题。谢谢!
答案 0 :(得分:5)
将尝试回答您的问题:
我是否完全忽略了这一点?
没有。您可以将noSQL CB视为持久分布式对象缓存。所以它不是RDBMS。但是,DAO模式非常适合这个模型...因为您在DAO级别和noSQL级别上处理DTO / ValueObjects / POJO。
我无法想象每个人都是这样做的吗?
我建议编写一个可以持久/检索POJO的通用Couchbase管理器类。然后,您可以在DAO中重复使用它。
每个人都在编写将文档转换为POJO模型类的方法 每个班级分开?或者使用json解析器来做到这一点(但那 如果我不想加载外键,他们不会为外键工作,是吗?
您可以在Couchbase管理器类中使用一个公共代码来执行从/到json到POJO的转换。所以你只使用POJO并且在你的应用程序代码中看不到任何json(在Couchbase管理器类之外) 以下是此类的示例:
public class CouchbaseManager<K, V>
{
private final Class<V> valueTypeParameterClass;
@Inject
private CouchbaseClient cbClient;
@Inject
private Gson gson;
public CouchbaseManager(final Class<V> valueClass)
{
this.valueTypeParameterClass = valueClass;
}
public V get(K key)
{
V res = null;
String jsonValue = null;
if (key != null)
{
jsonValue = (String) cbClient.get(key);
if (jsonValue != null)
{
res = gson.fromJson(jsonValue, valueTypeParameterClass);
}
}
return res;
}
public void put(K key, V value)
{
int ttl = 0;
cbClient.set(key, ttl, gson.toJson(value, valueTypeParameterClass));
}
}
然后在DAO代码中为每种类型创建CouchbaseManager实例:
CouchbaseManager<String,Customer> cbmCustomer = new CouchbaseManager<String,Customer>(Customer.class);
CouchbaseManager<String,Account> cbmAccount = new CouchbaseManager<String,Account>(Account.class);
// and so on for other POJOs you have.
// then get/put operations look simple
Customer cust = cbmCustomer.get("cust-1234");
cust.setName("New Name"); // mutate value
// store changes
cbmCustomer.put(cust.getId(), cust);
现在关于&#34;外键&#34;。记住它不是RDBMS所以它取决于你的代码有一个&#34;外键的概念&#34;。例如,Customer类可以具有帐户ID:
Customer cust = cbmCustomer.get("cust-1234");
String accId = cust.getAccountId();
//You can load account
Account acc = cbmAccount.get(accId);
所以你可以看到你自己都在做这件事。我希望Couchbase的JPA或JDO实施/提供商(例如DataNucleus或Hibernate)
您应该从POJO /文档设计开始,尝试将您的POJO实体拆分为&#34; chunks&#34;数据,以在粗粒度与细粒度POJO之间取得适当的平衡。 另请参阅this discussion on key/document design considerations。