我正在评估一些 NoSQL 实现(目前是 RavenDB 和 MongoDB),作为解决一组特定要求的方法,这些要求涉及无模式数据的存储/检索。我想就 NoSQL 是否是我应该研究的方向,或者是否还有其他(可能更简单)选项获得一些反馈。
本质上,我们有一个软件产品(除其他外)定义了一个基本领域模型,该模型由几个相关实体组成,每个实体都有许多属性(键/值)。当我们发布给客户时,我们与他们一起设置属性和值,这本质上是系统的配置。这相当简单,并且因为设计是预先知道的,所以我们不需要任何动态来实现这一点并使其执行(我们将使用 RDBMS)。属性不是预先知道的,但这又不是问题,因为系统的这一部分几乎围绕属性模型展开。
问题是,对于不同的客户,在我们发布并投入生产之后,我们发现我们需要查询我们在编译和发布代码时(以及在我们配置属性之前)一无所知的特定属性数据集客户)。我们基本上需要从我们可以存储的属性映射中生成数据(我们不会预先知道结构),然后以我们无法预料的方式查询存储的数据。现在的想法是,我们可以创建在处理过程中受到影响的钩子,并允许我们插入库(可能通过 MEF)创建数据以便存储它,然后在需要时查询它(不是为了报告——通常用于创建额外的数据/属性)。
(请注意,创建挂钩和插件库是一个单独的问题,并不打算成为这个问题的一部分。)
一个常见的场景可能是:“我想知道过去 10 天内 xxx 发生了多少次”。所以我会创建一个插件来识别 xxx 已经发生,并将其写入带有日期/时间的数据存储。然后我会创建另一个插件(可能在同一个 DLL 中)来执行查询,并向模型添加一个名为“CountOfxxxInLast10Days”的属性。另一种情况可能是创建可配置的查找。因此,我可能有一个在启动时运行的插件,以创建/更新可以将一个属性值转换为另一个属性值的查找数据表,或者(更有可能)将转换为查找值的一系列值。因此转换插件可能会添加一个包含列的表:bottom_value、top_value、multiplier,并且查询插件将使用属性值查询该表,例如“
在某些情况下,可以在指定时间段后清除旧数据。在上述第一个场景中,可能需要从存储/缓存中删除十天之前的数据。
在其他情况下,数据需要永久保存,就像上面的第二种情况一样。有可能这些数据可以在启动时简单地重新创建,而不是保存在永久存储中。
其他要求:
- 数据存储/缓存可以在线备份和恢复
- 在崩溃的情况下可以从上次备份中替换/恢复
- 数据在机器重启等事件中幸存下来
- 经过验证/生产测试的技术
在这一点上,我们非常致力于 .Net 平台,因此任何选项都必须具有可靠的 .Net 客户端/API。