C# 是';重型';RavenDB中的聚合函数是否可取?
我正在用C#开发一个概念验证时间表应用程序,它允许用户简单地输入大量时间表记录。概念验证将使用RavenDB作为存储提供程序,但是下面的问题可能与nosql概念更相关 用户通常会在每个工作日输入1到10条记录。我们只需说,为了便于讨论,到今年年底,这一特定收藏将有大量记录(数万或数十万) 记录的模型将定义为: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
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;}
}
从逻辑上讲,应用程序将允许用户或项目经理动态创建报告。想象一下动态报告,如:
- 项目、客户或用户花费的总时间
- 在特定时间跨度内(如一周、一个月或在特定日期之间)为项目或客户花费的时间
- 未批准的总小时数(按用户或所有用户)
- 等等
查询
函数,以生成所需的数据
在“常规”关系表中,这一切都不会有问题。不管有没有标准化,这都是轻而易举的事。概念验证的基础是:它是否也会在nosql变体中混合?这个问题是因为在被警告这些“重”聚合函数(如嵌套的WHERE约束和SUM等)在文档存储变体中并不理想后,我产生了一些疑问
考虑到所有这些,我有两个问题:
任何建议或想法都会很好 我是RavenDB的忠实粉丝,但它不是银弹或金锤。在某些情况下,它不是工作的最佳工具,这可能是其中之一 具体来说,当不知道特定的数据访问模式时,一般的文档数据库,特别是RavenDB,并不十分适用。RavenDB能够创建Map/Reduce索引,这些索引可以在聚合数据方面做一些惊人的事情,但是您必须提前知道如何聚合数据 如果您只需要(比方说)该数据的4个特定视图,那么您可以将该数据存储在Raven中,应用Map/Reduce索引,并且您将能够以极快的速度访问这些报告,因为它们将异步更新,并且始终具有优异的性能,因为数据已经存在,运行时不需要处理任何东西。当然,有些经理会说“你知道,如果我们也能看到\uuuu,那真是太好了。”如果经理的请求需要额外的开发时间来创建新的地图/减少索引、用户界面等,那么Raven仍然可以作为这项工作的工具
然而,听起来您有一个场景,其中包含一个基本上完全适合Excel的数据表,并且您希望能够以疯狂的方式查询数据,而这种方式在运行时之前是无法知道的。在这种情况下,最好使用关系数据库。它们是专门为这项任务而创建的,它们在这方面非常出色。谢谢,大卫。因此,您的意思是可以将Raven用于有限的可预测查询/聚合(使用map/reduce)和其他查询/聚合-go seek relational Variant?重要的是用于聚合。这些都是必须提前定义的。对于普通的按X、Y、Z查找或其他任何查询,Raven非常擅长动态创建索引,以便以各种方式查询数据并返回数据,只要您能够忍受自动索引在第一次尝试使用时可能会过时。Raven甚至会明智地抛弃那些被废弃的自动索引。你只是不能有一个自动映射/减少聚合索引。