当前位置:  开发笔记 > 后端 > 正文

稀疏数据:在RDBMS中高效存储和检索

如何解决《稀疏数据:在RDBMS中高效存储和检索》经验,为你挑选了1个好方法。

我有一个表格,表示项目修订版中源文件指标的值,如下所示:

Revision FileA FileB FileC FileD FileE ...
1           45     3    12   123   124
2           45     3    12   123   124
3           45     3    12   123   124
4           48     3    12   123   124
5           48     3    12   123   124
6           48     3    12   123   124
7           48    15    12   123   124

(上述数据的关系视图不同.每行包含以下列:Revision,FileId,Value.从中计算数据的文件及其修订版存储在Subversion存储库中,因此我们试图表示存储库的关系模式中的结构.)

10000次修订中最多可以有23750个文件(ImageMagick绘图程序就是这种情况).如您所见,连续修订之间的大多数值都是相同的,因此表的有用数据非常稀疏.我正在寻找一种存储数据的方法

避免复制并有效利用空间(目前非稀疏表示需要260 GB(数据+索引),少于我想要存储的数据的10%)

允许我使用SQL查询有效地检索特定修订的值(无需显式循环修订或文件)

允许我有效地检索特定度量值的修订版.

理想情况下,解决方案不应依赖于特定的RDBMS,而应与Hibernate兼容.如果这是不可能的,我可以使用Hibernate,MySQL或PostgreSQL特有的功能.



1> Tom H..:

这就是我对它进行建模的方式.我遗漏了Revisions表和Files表,因为它们应该是不言自明的.

CREATE TABLE Revision_Files
(
    start_revision_number   INT NOT NULL,
    end_revision_number     INT NOT NULL,
    file_number             INT NOT NULL,
    value                   INT NOT NULL,
    CONSTRAINT PK_Revision_Files PRIMARY KEY CLUSTERED (start_revision_number, file_number),
    CONSTRAINT CHK_Revision_Files_start_before_end CHECK (start_revision_number <= end_revision_number)
)
GO

要获取特定修订版文件的所有值,可以使用以下查询.使用外部联接加入文件表可以让您获得那些没有为该修订定义的值.

SELECT
    REV.revision_number,
    RF.file_number,
    RF.value
FROM
    Revisions REV
INNER JOIN Revision_Files RF ON
    RF.start_revision_number <= REV.revision_number AND
    RF.end_revision_number >= REV.revision_number
GO

假设我在第三点中正确理解了您想要的内容,这将使您获得特定文件具有特定值的所有修订:

SELECT
    REV.revision_number
FROM
    Revision_Files RF
INNER JOIN Revisions REV ON
    REV.revision_number BETWEEN RF.start_revision_number AND RF.end_revision_number
WHERE
    RF.file_number = @file_number AND
    RF.value = @value
GO

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有