如何在sql数据库中优化保存二维数组的快照

如何在sql数据库中优化保存二维数组的快照,sql,sql-server,relational-database,Sql,Sql Server,Relational Database,我有一个数据源,可以生成数百万个二维双数组(矩阵)。维度的大小不断变化(但可以通过数学变换简化情况,只允许一个维度改变大小)。所以,我需要将这个矩阵的所有状态保存到数据库中(她的近似大小从10x50到10x100-第二个维度的大小随时间而变化)。如果我使用时间作为主键,这意味着我必须创建数百万个表,每个表将包含10列和50到100行。。。不太方便。有没有办法更有效地对矩阵的状态进行分组?我是SQL新手。一个包含以下列的表怎么样: (id,)state_number,row,column,valu

我有一个数据源,可以生成数百万个二维双数组(矩阵)。维度的大小不断变化(但可以通过数学变换简化情况,只允许一个维度改变大小)。所以,我需要将这个矩阵的所有状态保存到数据库中(她的近似大小从10x50到10x100-第二个维度的大小随时间而变化)。如果我使用时间作为主键,这意味着我必须创建数百万个表,每个表将包含10列和50到100行。。。不太方便。有没有办法更有效地对矩阵的状态进行分组?我是SQL新手。

一个包含以下列的表怎么样:


(id,)state_number,row,column,value

理论:如何使用重型工具(如MySQL)

MySQL通常被归类为“重型工具”。重型工具可以很好地解决相当广泛的问题,但通常也有其独特的特点,即它们做得好、差或根本不好。对于所有重型工具,挑战在于找到您的问题与重型工具特性之间最接近的匹配,然后以最简单的方式弥合差距。您正在执行步骤2

解决方案步骤1:您与工具之间最接近的匹配

我能想到的最接近您的特定问题与MySQL特性的匹配与您的相同:表如下所示

栏目:

id dataset_time col1 col2 col3 col4 col5 col6 col7 col8 col9 col10

auto increment: id
primary key: id
id dataset_time col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 dataset_id

auto increment: id
primary key: id
non-unique index: dataset_id
解决方案步骤2:弥合剩余差距

然而,正如您所注意到的,为每个矩阵创建一个表并不是弥合问题与MySQL之间剩余差距的最简单方法。MySQL可以创建数千个表,表名中有一个数字索引,但效果很差

弥合这一差距的最简单方法是引入一个名为dataset_id的附加列,以使表如下所示:

SELECT * FROM matrices WHERE dataset_id=761
栏目:

id dataset_time col1 col2 col3 col4 col5 col6 col7 col8 col9 col10

auto increment: id
primary key: id
id dataset_time col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 dataset_id

auto increment: id
primary key: id
non-unique index: dataset_id
您应该手动增加数据集id,并将其插入每一行和相应的记录时间。这比按时间识别每个数据集更可靠

然后,您可以检索如下数据集:

SELECT * FROM matrices WHERE dataset_id=761

MySQL具有高效的索引功能和优雅的语法,可以从数百万行中检索几十行,因此可以说它做得非常好。因此,这是您的最佳解决方案。

您希望以后如何访问数据?是否需要根据矩阵中存储的内容查找信息?主键可以是复合键,因此在这种情况下,键(时间、行、列)是合适的。是的,我需要分析矩阵的序列(大约500-1000个状态)。我已经考虑过在单独的表中创建一个包含时间的附加列并收集一天的状态(大约9000万个状态-这意味着从9000*5000万行到9000*100万行),并使用时间收集状态。考虑到有30个矩阵,必须观察谁的状态,这太糟糕了。是的,我将不得不添加两列——状态时间,大约50-100行和当前状态的行数相同。SQL是否会依次从数据库中选择行?您是否考虑过noSql数据库?这似乎更适合您的需求。@Tyriar:他是在建议,而不是询问。我建议不要使用键值类型存储,因为有一个更简单的解决方案可用。此解决方案需要不必要的语法和性能开销。