【问题标题】:Database Design for Covariance Matrix (constant size, diagonally symmetric)协方差矩阵的数据库设计(恒定大小,对角对称)
【发布时间】:2012-06-05 03:38:27
【问题描述】:

我对关系数据库设计领域相当陌生,我正在尝试在表中存储一个 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 矩阵。

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

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

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

【问题讨论】:

  • 数据库在矩阵计算方面很糟糕。我建议根本不要将其存储在数据库中。
  • 你想用它做什么?
  • @Andomar:谢谢,我并不是真的想在数据库中进行计算,我只是想存储数据,以便我可以将其取出并在单独的工具中进行计算(Python,in我的情况)。
  • 你会假设它总是 9X9 是你需要的最大尺寸吗?您还可以考虑的一件事是使用 csv 文件,但如果有很多读/写争用,这可能比它的价值更多。
  • @JohnKane:是的,这是我永远需要的最大值。 (危险的话,我知道)

标签: python sql database arrays database-design


【解决方案1】:

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

根据您所说的,每个单元格有一条记录似乎是最干净的事情,因为这将在未来为您提供最大的灵活性。如果你有兴趣阅读数据库设计this is a pretty good starting place

一种可能的设计是:

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

【讨论】:

  • 谢谢,这就是我现在所拥有的。我尝试使用数据库的原因是我的整体数据集并不小或根本不简单。例如,在任何一天,我可能会执行 5 次运行,每次运行 10 个“轨迹”,每个轨迹有 1,000 个时间点,每个时间点可能有 5 个协方差(以及许多其他数据)。然后,我可能想将这些轨道中的任何一个与来自该运行或不同运行的另一个轨道进行比较。根据我对关系数据库的了解,这似乎是一个潜在的好应用程序。
  • 是的,我希望规模更小。关系数据库可能最有意义。
  • csv 当然是更简单的方法,这就是我开始使用它的原因。现在我有机会改进我做事的方式,并在此过程中了解数据库。双赢!
  • 您在数据库中存储了哪些其他数据?您是否考虑过如何将矩阵与其所属实体联系起来?
  • 我不确定您使用的数据库类型,但有些支持数组类型,您可以使用它来支持您的矩阵。
【解决方案2】:

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

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

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

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

【讨论】:

  • 谢谢。我明白你关于另一个识别领域的观点。我猜在我有了这个之后,我可以从标识符、行和列字段中创建一个主键。最终,我希望能够快速轻松地从数据库写入/读取到 numpy 数组。
  • 这将用作主键。但是请注意,包含数以百万计的行的索引,其值的范围仅在 1 和 6(或 9)之间,这对性能毫无帮助。 (将标识字段设为索引中的第一个,就可以了。)
猜你喜欢
  • 2017-02-26
  • 2015-07-12
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
相关资源
最近更新 更多