【问题标题】:Creating specific view for specific retrieval of data in chouchbase为 chouchbase 中的特定数据检索创建特定视图
【发布时间】:2016-04-17 13:15:03
【问题描述】:

我和我的一个队友就在沙发库中创建视图以检索数据进行了一次对话。

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

  • 特定组的管理员
  • 超级管理员

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

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

例如: 创建接受组 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();

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

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

【问题讨论】:

  • 要给出答案,我们需要知道您的文档结构和您想询问的问题。通常,视图既定义了可以有效检索某些文档的索引,又定义了经典的数据库视图,即文档的选择和投影。如果您的查询仅因开始和结束键值不同(例如,仅一组人员或所有组的人员),您可以使用一个视图。如果查询在结构上有所不同(例如小组的员工或学历的员工),您将需要更多。
  • @TAM 我更新了我的问题。无法提供太多的文档结构,但这就是它的样子。

标签: c# linq couchbase nosql


【解决方案1】:

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

性能考虑:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 2017-10-17
    • 2018-12-17
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多