在MySQL数据库中存储整数数组

在MySQL数据库中存储整数数组,mysql,arrays,Mysql,Arrays,我有很多光谱要存储在数据库中。频谱基本上是一个整数数组,在我的例子中,可变长度通常为512或1024。如何最好地存储这些光谱?除了光谱之外,我还想存储一些额外的数据,比如时间和标签,它们将是我数据库中的简单字段。光谱不会经常被检索,如果我需要它们,我需要它们作为一个整体 为了存储光谱,我可以想到两种可能的解决方案: 将它们存储为字符串,如“1,7,9,3,…” 将光谱存储在单独的表中,每个值位于单独的行中,包含光谱id、索引和值等字段 对使用哪一个有什么建议吗?当然,我们非常感谢其他解决方案

我有很多光谱要存储在数据库中。频谱基本上是一个整数数组,在我的例子中,可变长度通常为512或1024。如何最好地存储这些光谱?除了光谱之外,我还想存储一些额外的数据,比如时间和标签,它们将是我数据库中的简单字段。光谱不会经常被检索,如果我需要它们,我需要它们作为一个整体

为了存储光谱,我可以想到两种可能的解决方案:

  • 将它们存储为字符串,如“1,7,9,3,…”
  • 将光谱存储在单独的表中,每个值位于单独的行中,包含光谱id、索引和值等字段

对使用哪一个有什么建议吗?当然,我们非常感谢其他解决方案

当人们从过程性/面向对象编程思维转变为数据库思维时,您的第一个解决方案是一个常见的错误。这一切都是为了提高效率,减少获取记录的数量等。数据库世界需要不同的范式来存储和检索数据

以下是我的做法:制作两张桌子:

spectra
---------
spectra_id (primary key)
label
time

spectra_detail
---------
spectra_id
index
value
要检索它们,请执行以下操作:

SELECT     *
FROM       spectra s
INNER JOIN spectra_detail sd ON s.spectra_id = sd.spectra_id
WHERE      s.spectra_id = 42

如果您有一个小的数据集(数百MB),那么将SQL DBMS与任何备选方案一起使用都没有问题

正如Maciej所提出的,序列化是对其他替代方案的改进,例如可以将每个频谱扫描分组到单个元组(表中的行),从而减少键和其他信息的开销

对于序列化,您可以考虑使用诸如LySnSnpe或多点这样的对象,以便能够更好地使用SQL函数处理数据。这将需要一些扩展,但允许查询数据,如果使用WKB,还可以在性能损失很小的情况下获得相关的存储使用收益

问题是频谱数据往往会累积,存储使用可能会成为序列化技巧无法轻松解决的问题。你应该在你的项目中仔细考虑这一点。 在研究一个类似的问题时,我得出结论:使用任何SQL DMB(MySQL、SQL Server、Postgre等)来管理大型数值矩阵数据(如频谱扫描测量)是一个坏主意。这有点像试图通过将图像逐像素存储到数据库中来创建图像库CMS

下表显示了我实验中几种格式之间的比较。这可能有助于理解使用SQL DBMS存储数值数据矩阵的问题

MySQL Table​ Table with key - Int(10) - and value - decimal(4,1) 1 157 627 904 B​ TXT CSV decimal(4,1), equivalent to 14bit 276 895 606 B​ BIN (original) Matrix 1 byte x 51200 columns x 773 rows + Metadata 40 038 580 B HDF5 Matrix 3 bytes x 51200 columns x 773 rows + Metadata 35 192 973 B TXT + Zip​ CSV decimal (4,1) + standard zip compression 34 175 971 B PNGRGBa​ Matrix 4 bytes x 51200 columns x 773 rows 33 997 095 B ZIP(BIN)​ Original BIN file compressed with standard zip 26 028 780 B PNG 8bIndexed​ Matrix 1 byte x 51200 columns x 773 rows + Color scale 25 947 324 B MySQL表​ 带键Int(10)和值decimal(4,1)1 157 627 904 B的表格​ TXT CSV十进制(4,1),相当于14位276 895 606 B​ BIN(原始)矩阵1字节x 51200列x 773行+元数据40 038 580 B HDF5矩阵3字节x 51200列x 773行+元数据35 192 973 B TXT+Zip​ CSV十进制(4,1)+标准zip压缩34 175 971 B PNGRGBa​ 矩阵4字节x 51200列x 773行33 997 095 B 邮政信箱​ 使用标准zip 26 028 780 B压缩的原始BIN文件 PNG 8B索引​ 矩阵1字节x 51200列x 773行+色标25 947 324 B 使用MySQL的示例没有使用任何序列化。我没有尝试过,但使用WKT LineString或类似功能可以将占用的存储空间减少到几乎一半。即便如此,使用的存储空间几乎是相应CSV的两倍,是具有相同数据的PNG8b大小的20多倍

当您停下来思考在使用SQL DBMS时,在键和搜索优化方面存储了多少额外数据时,这些数字是可以预料到的

期末备注,我建议您考虑使用PNG、TIFF、HDF5或任何其他更适合于构建前端的数字格式,以存储频谱数据(或任何其他大矩阵),并使用SQL DBMS作为核心数据的尺寸,如WHO措施,当使用哪种设备时,总之,在数据库中有一个BLOB和文件,或者在数据库外部有一个BLOB,因为它更适合您的系统架构


另一方面,值得考虑在一些数字格式(例如HDF5)周围使用大数据解决方案。每个工具都有一个终点。

我想存储的光谱是一个很好的图表,在x轴上有波长和功率,或者光子计数,或者在y轴上有类似的东西。您存储的每个光谱是否共享相同的x轴值?您是否需要存储和检索描述单个光谱x轴的信息?您是否想通过诸如“查找550nm处测量值>250的光谱”之类的查询进行查找?谢谢。你的解决方案基本上就是我对第二种选择的想法。虽然乍一看这个选项更复杂,但我同意这可能更有效。然而,我惊讶地看到,在PHP代码中,在将数组写入数据库之前,serialize函数被频繁地用于将数组转换为字符串。如果不需要根据该数据进行查询,序列化方法会更好。