我和我的一个队友讨论了如何在couchbase中创建用于检索数据的视图。
所以我的建议是以特定的数据检索方式创建视图,这样会更加快速和直接。例如,我们有两个不同的管理员:
管理员从其特定组中检索数据,超级管理员从所有组中获取数据。
将group管理员限制为获取属于他们的数据而不是获取所有数据然后在后端处理它们并比较哪些数据属于某个组是有意义的。
例如: 创建接受组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
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在后端处理它们。 / p>
在后端处理它们的示例:
获取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();
注意:在呈现为用户检索数据的网页时,某种程度上对我们来说性能有点重要。
所以我的问题是这种情况的最佳方法是什么?
答案 0 :(得分:2)
我还没有在实时系统上测试您的提案,但是使用每个查询类型的视图看起来就像是您的要求的教科书解决方案。如果您需要通过不同条件访问数据的查询,请为每组条件定义一个视图。
性能考虑因素:
空间:您的视图将生成一个索引,其中包含每个选定文档的发布值和文档ID。与您的整体数据量相比,这应该没有问题。我可以成像的唯一例外是硬件资源非常有限,例如:如果您的应用程序在汽车中的嵌入式硬件上运行,每个分数都计算在内。
运行时:数据库上的操作总和取决于更改索引的插入和更新数量加上数据查询的数量以及每个查询检索的记录数。现在,如果相关插入/更新操作的计数超过查询计数,则索引可能会增加操作的总数。但是,在大多数数据库应用程序中,查询比修改操作要多得多,因此通过减少选择所需数据的工作量来补偿每个使索引保持最新的操作。如果仍有疑问,您可以粗略估计与您的观点相关的插入,更新和查询操作的数量。
从另一个角度来看,如果您需要根据某些条件选择数据,有两种方法可以实现此目的:在数据库中,使用视图或在您的应用程序中。在您的应用程序中执行此操作会带来两个性能问题:必须将更多数据从数据库传输到您的应用程序,并且您的应用程序需要包含一个选择算法,这些算法很可能不会比提供的算法更快由数据库。
总而言之,除非您的插入/更新操作大大超出您的查询范围,否则为您的不同数据访问方式定义视图是可行的方法。