在 couchbase 中为特定数据检索创建特定视图

Creating specific view for specific retrieval of data in chouchbase

我和我的一个队友讨论了在 couchbase 中创建视图以检索数据。

所以我的建议是为特定的数据检索创建视图,这样会更快更直接。例如,我们有两个不同的管理员:

管理员从他们的特定组中获取数据,超级管理员从所有组中获取数据。

只限制组的管理员获取属于他们的数据而不是获取所有数据然后在后端处理它们并比较哪些数据属于一个组是有意义的。

例如: 创建接受组 ID 并查询其所有数据的 couchbase 视图

另一方面,她只在有复杂的东西(例如计算)时才创建视图,并且创建更多视图可能难以维护。

因为目前我们只使用一个获取所有数据的视图,一旦我们拥有它们,我们就通过使用 LINQ 在后端获取特定组的特定数据来处理它们。

文档结构:

{
   "fooReference": "",
   "groupId": 8,
   "fooName": "projectTest",
   "externalId": "PR572",
   "fooDescription": "OG QGpCst vXAuu",
   "property5": {
       "property1": "124",
       "code": "US",
       "value": 267206,
       "start": "2014-10-01T00:00:00Z",
       "end": "2017-09-30T00:00:00Z"
   },
   "property6": [
       "string1",
       "string2",
       "string14"
   ],
   "property7": [
   ],
   "property8": [
   ],
   "dateAdded": "2016-02-11T07:22:15.2483042Z",
   "ownerId": 72,
   "dateUpdated": "2016-02-11T07:22:15.2483042Z",
   "property9": [
       {
           "id": 72,
           "type": 0
       }
   ],
   "property10": false,
   "id": "345",
   "deleted": false,
   "type": "Foo",
   "subtype": "Foo"
}

获取所有查询:

function (doc, meta) {
  if (doc.type == "Foo" && !doc.deleted) {
    emit(meta.id, null); 
  }
}

这是我要建议的示例查询: 如果我想让它通过 groupId 获取,只需在 emit

中传递 groupId
function(doc, meta) {
     if (doc.type == "Foo" && !doc.deleted) {
         emit(doc.groupId, doc);
     }
 }

如果我想得到 externalId 我只需要将 externalId 传递给 emit

function(doc, meta) {
         if (doc.type == "Foo" && !doc.deleted) {
             emit(doc.externalId, doc);
         }
     }

通过这种方式,我们有不同的查询,具有不同的获取文档的作用,我们不必仅通过 id 获取所有文档并使用 LINQ 在后端处理它们。

在后端处理它们的示例:

获取groupId:

var foos = _fooRepository.GetAll();
foos = foos.Where(s => s.GroupId == group.Id).ToList();

获取externalId:

var foos = _fooRepository.GetAll();
foos = foos.Where(s => s.externalId == foo.externalId).ToList();

注意:不知何故,性能对我们来说有些重要,特别是在呈现为用户检索数据的页面时。

所以我的问题是这种情况的最佳方法是什么?

我没有在实时系统上测试过您的建议,但是针对您的每种查询类型使用一个视图看起来就像满足您的要求的教科书解决方案。如果您需要查询以通过不同的条件访问您的数据,请为每组条件定义一个视图。

性能注意事项:

Space:您的视图将为每个 selected 文档生成一个索引,其中包含发出的值和文档 ID。与你的整体数据量相比,这应该是完全没有问题的。我可以想象的唯一例外是极其有限的硬件资源,例如如果您的应用程序在汽车的嵌入式硬件上运行,每一分钱都很重要。

运行时:数据库操作的总和取决于更改索引的插入和更新次数加上对数据的查询次数以及每个查询检索的记录数。现在,如果相关 insert/update 操作的数量超过查询数量,索引可能会增加操作的总数。然而,在大多数数据库应用程序中,查询比修改操作多得多,因此使索引保持最新的每个操作都可以通过减少 select 所需数据的工作量来弥补。如果仍有疑问,您可以粗略估计与您的视图相关的插入、更新和查询操作的数量。

从另一个角度来看,如果您需要根据某些条件select 数据,有两种方法可以实现:在数据库中,使用视图,或者在您的应用程序中。在您的应用程序中执行此操作会带来两个性能问题:必须将更多数据从您的数据库传输到您的应用程序,并且您的应用程序将需要包含一个 selection 算法,该算法很可能不会比数据库提供的那个

总而言之,除非您的 insert/update 操作大大超过您的查询,否则为访问数据的不同方式定义视图是可行的方法。