【问题标题】:bare JSON, nosql db or sqlite for android and web app (maybe iOS) for task managment裸 JSON、nosql db 或 sqlite 用于 android 和 web 应用程序(可能是 iOS),用于任务管理
【发布时间】:2013-08-17 09:19:31
【问题描述】:

对不起,我的英语不是我的母语。

我想开发具有此基本功能的应用程序:

  1. 用户可以创建带有子任务的任务。层次结构的级别应该是无限的,因此子任务可以有自己的子任务等等。
  2. 用户可以创建标签,每个任务可以有无限级别的标签,因此用户可以查看所有被某些标签标记的任务。
  3. 任务应与云同步。
  4. 它应该工作得很快。因此,例如,用户在转换下一级任务或显示具有不同标签的项目时不会遇到任何延迟。

嗯,还有很多其他功能,比如提醒和其他东西,但它与这种裸 JSON、nosql db 或 sqlite 的选择无关。

问题是什么更适合这个功能?

例如:

  1. 在 sql 中,我们必须将子任务的 ID 存储在模式中的某个位置,并对 n 级层次结构执行 O(n) 查询,但在 json 中相当容易。我们可以有一个包含任务数组的任务对象,这是它的子任务。或者在 xml 中(我不知道这是否可以在 JSON 中完成)我们可能只是有一些子任务 ID 的数组)。我应该怎么选,你怎么看?
  2. 在 JSON 中,我可以有称为“标签”的字符串项。每个任务都可以有一系列标签,非常简单。在 sql 中,我必须有另一个表“标签”,其中包含所有标签和所有任务 ID,每个唯一的标签和 ID 对都有一个,这有点多余。
  3. 使用 JSON 可以轻松与云同步。我可以只拥有一个包含所有任务的大文件,并将其从服务器上传或上传到服务器,具体取决于最新更改的位置(嗯,基本上)。但是有两个问题。但是这样我会传输所有文件,而更改很少,这样应用程序应该会消耗更多流量。也许 noSQL DB 可以解决这个问题?在 sql 中,app 也可以这样做,但它必须传输所有 db 数据。

【问题讨论】:

    标签: android sql json web nosql


    【解决方案1】:

    Couchbase Lite 是适用于 iOS 和 Android 的嵌入式原生 NoSQL 数据库。它存储 JSON 文档并通过您的云服务器将它们透明地同步到其他设备,其安全模型专为多用户交互式应用程序中的细粒度访问控制而设计。

    这里的 Github 存储库:

    这里的邮件列表:https://groups.google.com/forum/#!forum/mobile-couchbase

    【讨论】:

    • 好的,但为什么是 Couchbase Lite 而不是其他的 noSQL 解决方案?为什么选择 NoSQL 而不是 SQLite?为什么不裸 JSON?该数据库中的对象可以保存相同类型的对象吗?
    【解决方案2】:

    这里有一些想法-

    couchDB 被认为是一种很好的键值存储类型,用于跨多个服务器/客户端进行复制。对于您所描述的问题,这可能是一种合适的数据库类型。

    否则,在您的场景中使用任何类型的带有 REST 访问点的 SQL/noSQL 样式的数据库都可以。我认为 MongoDB 是一个特别好的选择,因为尽管它是键/值存储,但对于来自 SQL 单词的人来说,它可以快速学习——它还会以 json 形式返回你的查询的答案——所以如果你使用像 NodeJS 这样的东西作为你的 REST 服务器它可以简化一些事情。

    至于您的应用程序的一般结构 - 请查看 http://developer.asana.com/documentation/ 的 asana 文档 - 它应该会给您一个很好的起点。

    【讨论】:

    • 好吧,couchDB 是谷歌中第一个使用“nosql android”查询的数据库。但我无法理解其中的查询语言是什么?我能用它做什么?他们是否有像 (jsonobject.addObject("name" : "subtasks") 这样简单的 API?
    【解决方案3】:

    由于这还没有被提出,SnappyDB 有一个非常简单的 API,并且是一个用于 android 的 NoSQL 数据库。它可以持久化任何对象(网站说)。就是这样使用的

    try {
        DB snappydb = DBFactory.open(context); //create or open an existing databse using the default name
    
        snappydb.put("name", "Jack Reacher"); 
        snappydb.putInt("age", 42);  
        snappydb.putBoolean("single", true);
        snappydb.put("books", new String[]{"One Shot", "Tripwire", "61 Hours"}); 
    
        String   name   =  snappydb.get("name");
        int        age    =  snappydb.getInt("age");
        boolean  single =  snappydb.getBoolean("single");
        String[] books  =  snappydb.getArray("books", String.class);// get array of string
    
        snappydb.close();
    
        } catch (SnappydbException e) {
    }
    

    存储一个可序列化的对象:

    AtomicInteger objAtomicInt = new AtomicInteger (42);
    snappyDB.put("atomic integer", objAtomicInt);
    AtomicInteger myObject = snappyDB.get("atomic integer", AtomicInteger.class);
    

    存储任何对象:

    MyPojo pojo = new MyPojo ();
    snappyDB.put("my_pojo", pojo);
    MyPojo myObject = snappyDB.getObject("non_serializable", MyPojo.class);
    

    【讨论】:

      【解决方案4】:

      ThingDB 是一个可嵌入的 NoSQL 数据库,带有类似 MongoDB 的 API:

      DB db = new DB("./db");
      Doc doc=new Doc();
      doc.put("name","test");
      doc.put("age",31);
      db.insert(doc);
      //later you can find the saved doc:
      Doc d=db.findOne(eq("name","test"));
      

      您还可以将 Doc 转换为 org.json.JSONObject:

      JSONObject jo=d.toJSONObject();
      

      https://github.com/neo-expert/thingdb

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-27
        • 2010-12-16
        • 2015-07-04
        • 2014-06-28
        • 2017-05-30
        • 1970-01-01
        相关资源
        最近更新 更多