Sql 稀疏数据:RDBMS中的高效存储和检索
我有一个表,表示跨项目修订的源文件度量值,如下所示:Sql 稀疏数据:RDBMS中的高效存储和检索,sql,mysql,hibernate,postgresql,sparse-matrix,Sql,Mysql,Hibernate,Postgresql,Sparse Matrix,我有一个表,表示跨项目修订的源文件度量值,如下所示: 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
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个文件(图形程序就是这种情况)。如您所见,大多数值在连续修订之间是相同的,因此表中的有用数据非常稀疏。我正在寻找一种方法来存储
- 避免复制并高效地使用空间(目前,非稀疏表示需要260 GB(数据+索引)才能存储少于10%的数据)
- 允许我使用SQL查询高效地检索特定修订的值(无需显式循环浏览修订或文件)
- 允许我有效地检索特定度量值的修订
理想情况下,解决方案不应依赖于特定的解决方案,而应与特定的解决方案兼容。如果这是不可能的,我可以使用Hibernate、MySQL或PostgreSQL的特定功能。这就是我可以对其建模的方式。我省略了修订表和文件表,因为它们应该是非常自解释的
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
我不确定我是否完全理解你在跟踪什么。版本4有两个单独的FileB值?如果您想要版本4,您如何知道使用哪个值?抱歉,这是一个输入错误,我在复制粘贴行后忘记更改版本。我现在更正了数据。非常好-谢谢!看来,射程才是最好的选择。我也很欣赏您在表定义中对SQL的专业使用。
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