Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 稀疏数据:RDBMS中的高效存储和检索_Sql_Mysql_Hibernate_Postgresql_Sparse Matrix - Fatal编程技术网

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