Android上的Couchbase lite - 一般架构?

时间:2014-09-17 18:40:41

标签: android database architecture couchbase

我们正在使用couchbase构建项目。在Android上,我使用couchbase lite。通常,我一直在使用关系数据库,因为我是沙发基础新手,我无法找到“正确”的架构。我理解我认为的核心概念,但所有样本和指南似乎都坚持某种简单的设置,他们在活动中访问数据库。

我更习惯于拥有一些数据库抽象,其中业务逻辑只能看到通过数据库接口或某些DAO或其他东西传递的POJO DTO。所以我现在已经注释了我的模型类,并开始编写一个简单的OR映射器,但是使用不同类型的数据,外键等等,这会非常快速地耗费时间。

我是否完全忽略了这一点?我无法想象每个人都这样做吗?我每个人都在编写将文档单独转换为每个类的POJO模型类的方法吗?或者使用json解析器来做到这一点(但如果我不想加载外键那么这对外键不起作用,是吗?)

很抱歉问题很多,但我觉得我错过了一些明显的问题。谢谢!

1 个答案:

答案 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的JPAJDO实施/提供商(例如DataNucleusHibernate

您应该从POJO /文档设计开始,尝试将您的POJO实体拆分为&#34; chunks&#34;数据,以在粗粒度与细粒度POJO之间取得适当的平衡。 另请参阅this discussion on key/document design considerations