处理离线优先移动应用程序(PouchDB)的大数据集的最佳方法

时间:2016-10-07 04:29:31

标签: cordova couchdb ionic2 pouchdb

所以我使用Ionic v2并使用Pouch进行移动开发,使用sqlite。来自REST API的数据包含以下内容:

{
  "record-id": "2332255",
  "record-name": "record-ABC-XTY",
  "record-items": [
    {
      "item-id": "456454",
      "item-name": "item-XADD",
      "category": "Cat1",
      "subcategory": "Subcat1",
      "location": "LocationXYZ",
      "owner": "Person1",
      "data-rows": [
        {
          "row-name": "sampleRowName1",
          "row-value": "ABC-XASS"
        },
        {
          "row-name": "sampleRowName2",
          "row-value": "ABC-XASS"
        }
      ]
    },
    {
      "item-id": "654645",
      "item-name": "item-BNSSA",
      "category": "Cat2",
      "subcategory": "Subcat2",
      "location": "LocationABC",
      "owner": "Person2",
      "data-rows": [
        {
          "row-name": "sampleRowName1",
          "row-value": "ABC-XASS"
        },
        {
          "row-name": "sampleRowName2",
          "row-value": "ABC-XASS"
        }
      ]
    }
  ]
}

现在您可以看到,记录项可能包含100,000个或更多项目(est json大小:32mb)。现在我迷失了我应该采取的方法。优化的数据处理至关重要,我不知道PouchDB方法更好。以下是我的一些想法。

  1. 将整个JSON数据保存为PouchDB的一个条目。但我担心它会在检索时占用大量内存,并会使该应用程序变慢。
  2. 将记录项目分成一个小袋条目记录并单独检索。我不确定这在整体性能方面是否更好,但PouchDB记录可能会更大(?)。
  3. 此外,还会进行排序,获取所有数据(仅显示_ids和少数字段以显示所有结果的列表)和搜索。

2 个答案:

答案 0 :(得分:0)

我们有一个类似的应用程序在离线模式下工作,并使用sqlite在本地存储数据,但我们处理的数据可能不是那么大。 对我们来说,数据是从Web服务下载为xml文件的; xml具有属性行,列,值,名称等。应用程序序列化数据并将其转换为对象,然后将其插入到sqlite中(使用" InsertAll" /" UpdateAll"插入或更新项目非常快)。这些xml被加载到UI中,用户可以更新" value"来自UI的标签 通过提供用户过滤器来优化搜索,以便在较小的数据上运行查询。

对于您的情况,我可以想到您可以使用的3个表: -

  

1)记录(字段:-RecordID,RecordName)   2)项目(字段: - ItemID(PK),RecordID(FK),ItemName等)   3)行(字段:-ItemID(FK),RowName,RowValue)

从REST生成数据后,您可以序列化数据并将其同时插入到各自的表中。尝试在搜索时为用户提供过滤器,以便实际数据集更小。

希望它有所帮助!

答案 1 :(得分:0)

您的基本决定是嵌入数据还是引用数据。以下是一些决定的一般规则:

嵌入时间:

  • 通常一起查询数据(例如:用户个人资料)
  • 孩子取决于父母
  • 一对一的关系
  • 一对一的关系
  • 以类似的速度发生变化

参考时间:

  • 存在无限的一对多关系
  • 多对多关系
  • 在许多地方重复相同的数据
  • 数据以不同的速率变化

如果您将所有内容存储为一条记录,那么您可能会遇到尺寸问题。分裂造成的额外存储应该是无关紧要的。

您将使用视图创建索引,然后将索引提供给您的查询。你如何做到这一点可能会主导效率。