met*_*ter 6 database architecture android couchbase
我们正在使用couchbase构建一个项目.在Android上,我使用couchbase lite.通常,我一直在使用关系数据库,因为我是沙发基础新手,我无法找到"正确"的架构.我理解我认为的核心概念,但所有的示例和指南似乎都坚持某种简单的设置,他们在活动中访问数据库.
我更习惯于拥有一些数据库抽象,其中业务逻辑只能看到通过数据库接口或某些DAO或其他东西传递的POJO DTO.所以我现在已经注释了我的模型类并开始编写一个简单的OR映射器,但是使用不同类型的数据,外键等等,这非常耗时.
我在某种程度上完全忽略了这一点吗?我无法想象每个人都这样做吗?我每个人都在编写将文档单独转换为每个类的POJO模型类的方法吗?或者使用json解析器来做到这一点(但如果我不想加载外键那么这对外键不起作用,是吗?)?
很抱歉问题很多,但我觉得我错过了一些明显的问题.谢谢!
会尝试回答你的问题:
我在某种程度上完全忽略了这一点吗?
不可以.您可以将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));
}
}
Run Code Online (Sandbox Code Playgroud)
然后在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);
Run Code Online (Sandbox Code Playgroud)
现在关于"外键".记住它不是RDBMS所以它取决于你的代码有"外键"的概念.例如,Customer类可以具有帐户的ID:
Customer cust = cbmCustomer.get("cust-1234");
String accId = cust.getAccountId();
//You can load account
Account acc = cbmAccount.get(accId);
Run Code Online (Sandbox Code Playgroud)
所以你可以看到你自己都在做这件事.我希望它是Couchbase的JPA或JDO实现/提供者(如DataNucleus或Hibernate)
您应该从您的POJO/Document设计开始,尝试将您的POJO实体拆分为"数据块",以便在粗粒度与细粒度POJO之间取得适当的平衡.另请参阅关于密钥/文档设计注意事项的讨论.