0

我对关系数据库设计领域相当陌生,并且正在尝试将 9x9 协方差矩阵存储在表中。行和列是位置、速度和加速度的 x、y、z 项。像这样:

        PosX PosY PosZ . . . AccZ
      -------------------------
PosX  |  XX   XY   XZ  . . .
PosY  |  YX   YY   YZ  . . . 
PosZ  |  ZX   ZY   ZZ  . . . 
.     |  .    .    .
.     |  .    .    .
.     |  .    .    .
AccZ  |

例如,最左上角的元素是 PosXPosX(上面缩写为 XX),最右边的是 PosXPosY,依此类推。矩阵沿对角线对称(即 PosXPosY == PosYPosX)。我也可能想要在同一张表中存储一个仅包含位置和速度的 6x6 矩阵。

根据我的研究,我发现了一种规范化的表格设计,可以创建一个包含行号、列号和值字段的表格(如何在数据库中表示二维数据矩阵)。我可以看到这样做的好处是灵活性,因为行数和列数是可变的。即使我有一定数量的行和列(9x9 和/或 6x6),这是最好的方法吗?我还可以设想创建一个表,其中包含每个唯一行/列组合(PosXPosX、PosXPosY ......等)的字段。这对我来说似乎更直观,但就像我说的那样,我是新手。

我的问题是:您建议如何在关系数据库中表示我的数据?我已经概述了两种可能的方法,但我不知道是否是最好的方法。在我的情况下,“最佳”意味着有效地存储和检索。我正在创建的实际上是一个数据存储库,因此数据库中的数据一旦添加就不会改变,只会读入 numpy 数组或类似数组。

更多背景知识:
我正在分析测试数据。我有多个不同配置的测试运行,每个测试运行都有多个数据点,其中包含许多不同类型的数据。我要存储和分析的数据点之一是协方差。我正在处理的数据量非常惊人,所以我希望使用数据库能够帮助我保持事物的组织性和可访问性。目标是存储所有这些数据,然后编写将从数据中提取的数据分析和可视化工具。在协方差的情况下,我正在计算诸如马氏距离、轨迹和时间传播的特征值之类的东西。我已经拥有许多这样的工具,但它们目前从许多不同的日志文件中提取,并且通常是一团糟。

4

2 回答 2

0

数据库非常擅长存储数量惊人的数据。如果不执行实际计算,您似乎希望使用它们快速、清晰、轻松地存储和检索您的信息。如果是这样,那么您将需要设计存储以实现高效检索。

行和列的字段(表列)似乎是必须的。您需要确保永远不要添加大于矩阵大小的值(行/列不超过 6 或 9)。您可以在 RDBMS 中使用一些技巧来确保这种情况永远不会发生,但它们可能会变得有点笨拙。

您将找到一个额外的字段来唯一标识正在存储的数据集是必不可少的在表上为该列建立索引,从数百万个中检索一组 36 或 81 个值将非常快。

你的第二个想法(每次观察一行)也可以工作。他们要考虑的关键是:如何使用数据?从长远来看,什么最有效,或最能满足您的目标?

于 2012-06-04T18:19:18.947 回答
0

只要您的数据集很小,并且您可以假设一旦读取的值不会被外部应用程序修改,那么可能值得考虑使用 csv 文件并将数据读取到最有用的任何数据结构中在您进行分析时。这也可以让您更轻松地查看数据,因为您只需要一个文本编辑器,或者如果您想要一种将其作为电子表格查看的方法。

根据您所说的,每个单元格有一个记录似乎是最干净的事情,因为这将在未来为您提供最大的灵活性。如果您有兴趣阅读有关数据库设计的信息,这是一个很好的起点

一种可能的设计可能是:

table matrix(record_id, parent_id, matrix_id, x, y, value) 

其中record_id 唯一标识一条记录,parent_id 是对该矩阵的拥有实体的引用,matrix_id 唯一标识矩阵中的元素,x 和y 是记录的坐标,value 是单元格值。

然后查询可能类似于:

select * 
    from matrix
where matrix_id=?
order by x asc, y asc
于 2012-06-04T18:35:16.950 回答