C# 是';重型';RavenDB中的聚合函数是否可取?

C# 是';重型';RavenDB中的聚合函数是否可取?,c#,design-patterns,nosql,ravendb,C#,Design Patterns,Nosql,Ravendb,我正在用C#开发一个概念验证时间表应用程序,它允许用户简单地输入大量时间表记录。概念验证将使用RavenDB作为存储提供程序,但是下面的问题可能与nosql概念更相关 用户通常会在每个工作日输入1到10条记录。我们只需说,为了便于讨论,到今年年底,这一特定收藏将有大量记录(数万或数十万) 记录的模型将定义为: class时间表记录{ 公共长Id{get;set;} public int UserId{get;set;} 公共布尔值已批准{get;set;} public DateTime Dat

我正在用C#开发一个概念验证时间表应用程序,它允许用户简单地输入大量时间表记录。概念验证将使用RavenDB作为存储提供程序,但是下面的问题可能与nosql概念更相关

用户通常会在每个工作日输入1到10条记录。我们只需说,为了便于讨论,到今年年底,这一特定收藏将有大量记录(数万或数十万)

记录的模型将定义为:

class时间表记录{
公共长Id{get;set;}
public int UserId{get;set;}
公共布尔值已批准{get;set;}
public DateTime DateFrom{get;set;}
公共DateTime DateTill{get;set;}
公共int?ProjectId{get;set;}
public int?CustomerId{get;set;}
公共字符串说明{get;set;}
}
从逻辑上讲,应用程序将允许用户或项目经理动态创建报告。想象一下动态报告,如:

  • 项目、客户或用户花费的总时间
  • 在特定时间跨度内(如一周、一个月或在特定日期之间)为项目或客户花费的时间
  • 未批准的总小时数(按用户或所有用户)
  • 等等
当然,可以选择添加额外的字段,如weeknumber、month等的整数,以减少按日期/期间过滤所需的处理量。其基本思想是按偏好使用
查询
函数,以生成所需的数据

在“常规”关系表中,这一切都不会有问题。不管有没有标准化,这都是轻而易举的事。概念验证的基础是:它是否也会在nosql变体中混合?这个问题是因为在被警告这些“重”聚合函数(如嵌套的WHERE约束和SUM等)在文档存储变体中并不理想后,我产生了一些疑问

考虑到所有这些,我有两个问题:

  • 对于nosql变体,特别是RavenDB,这是否可取
  • 方法正确吗 我可以想象,将所有数据冗余存储,而不是动态查询,会更高效。例如,添加某个用户在Project()或Customer()对象中花费的时间。然而,这将大大增加更新的复杂性。更不用说在整个集合中创建大量冗余数据了,这似乎直接违反了关注和干燥的分离


    任何建议或想法都会很好

    我是RavenDB的忠实粉丝,但它不是银弹或金锤。在某些情况下,它不是工作的最佳工具,这可能是其中之一

    具体来说,当不知道特定的数据访问模式时,一般的文档数据库,特别是RavenDB,并不十分适用。RavenDB能够创建Map/Reduce索引,这些索引可以在聚合数据方面做一些惊人的事情,但是您必须提前知道如何聚合数据

    如果您只需要(比方说)该数据的4个特定视图,那么您可以将该数据存储在Raven中,应用Map/Reduce索引,并且您将能够以极快的速度访问这些报告,因为它们将异步更新,并且始终具有优异的性能,因为数据已经存在,运行时不需要处理任何东西。当然,有些经理会说“你知道,如果我们也能看到\uuuu,那真是太好了。”如果经理的请求需要额外的开发时间来创建新的地图/减少索引、用户界面等,那么Raven仍然可以作为这项工作的工具


    然而,听起来您有一个场景,其中包含一个基本上完全适合Excel的数据表,并且您希望能够以疯狂的方式查询数据,而这种方式在运行时之前是无法知道的。在这种情况下,最好使用关系数据库。它们是专门为这项任务而创建的,它们在这方面非常出色。

    谢谢,大卫。因此,您的意思是可以将Raven用于有限的可预测查询/聚合(使用map/reduce)和其他查询/聚合-go seek relational Variant?重要的是用于聚合。这些都是必须提前定义的。对于普通的按X、Y、Z查找或其他任何查询,Raven非常擅长动态创建索引,以便以各种方式查询数据并返回数据,只要您能够忍受自动索引在第一次尝试使用时可能会过时。Raven甚至会明智地抛弃那些被废弃的自动索引。你只是不能有一个自动映射/减少聚合索引。