我正在评估 Java 中高效数据存储的选项。数据集是带有命名主键的时间戳数据值。例如
Name: A|B|C:D
Value: 124
TimeStamp: 01/06/2009 08:24:39,223
可能是给定时间点的股票价格,所以我想它是一个经典的时间序列数据模式。但是,我真的需要一个通用的 RDBMS 解决方案,它可以与任何合理的 JDBC 兼容数据库一起使用,因为我想使用 Hibernate。因此,对 Oracle 等数据库的时间序列扩展并不是一个真正的选择,因为我希望实现者能够使用他们自己的支持 JDBC/Hibernate 的数据库。
这里的挑战仅仅是可以在短时间内积累的海量数据。到目前为止,我的实现主要集中在定义定期汇总和清除计划,其中原始数据被聚合到 DAY、WEEK、MONTH 等表中,但缺点是粒度的早期损失以及存储在不同的周期之间的周期不匹配的轻微不便聚合体。
挑战的选择有限,因为在保持数据的原始粒度的同时可以物理压缩多少数据是有绝对限制的,而使用关系数据库的指令和支持通用 JDBC 的指令加剧了这一限制.
借用经典数据压缩算法的概念概念,并利用同一命名键的许多连续值可以预期相同的事实,我想知道是否有方法可以通过将重复值合并为无缝减少存储记录的数量一个逻辑行,同时还存储一个计数器,该计数器有效地指示“下一个n记录具有相同的值”。实现这一点似乎很简单,但要权衡的是,现在使用标准 SQL 查询数据模型非常复杂,尤其是在使用任何类型的聚合 SQL 函数时。这显着减少了数据存储的有用性,因为只有复杂的自定义代码才能将数据恢复到“解压缩”状态,从而导致与数百个无法正确呈现此数据的工具的阻抗不匹配。
我考虑了定义自定义 Hibernate 类型的可能性,这些类型基本上可以“理解”压缩数据集并将其备份并返回带有动态创建的合成行的查询结果。(除了严格控制的输入流之外,数据库将只读给所有客户端)。除了原始 JDBC(例如 JasperReports)之外,我想到的一些工具将与 Hibernate/POJOS 集成,但这并不能真正解决聚合函数问题,并且可能还有许多其他问题。
因此,我可能不得不使用更专有的 [可能是非 SQL] 数据存储(任何建议表示赞赏),然后专注于编写伪 JDBC 驱动程序的可能不太复杂的任务,以至少简化与外部工具。
我听说过一种称为“位压缩文件”的东西作为实现这种数据压缩的机制的参考,但我不知道有任何数据库提供这个以及我想要做的最后一件事(或者可以做,真的...... ) 是写我自己的数据库。
有什么建议或见解吗?