Java 在数据库中存储阵列
在数据库(例如hsqldb)中存储大型阵列(10000x100)最有效的方法是什么?我需要为我正在用java编写的某个数学程序这样做。请帮忙。Java 在数据库中存储阵列,java,database,hsqldb,Java,Database,Hsqldb,在数据库(例如hsqldb)中存储大型阵列(10000x100)最有效的方法是什么?我需要为我正在用java编写的某个数学程序这样做。请帮忙。 整个数组将经常被检索和存储(而不是单个元素)。此外,还需要存储有关数组的一些元数据。使用数组持有的数据定义一个表,并将数组值插入表中 这是非常简单的数据访问/存储。您的阵列尺寸是否始终相同? 在一个大的显式事务中完成。不要强制数据库系统为每个插入创建新的隐式事务 使用事先准备好的陈述 好问题 除非您想将数组转换成一组规范化的表(听起来好像没有),否则您可
整个数组将经常被检索和存储(而不是单个元素)。此外,还需要存储有关数组的一些元数据。使用数组持有的数据定义一个表,并将数组值插入表中 这是非常简单的数据访问/存储。您的阵列尺寸是否始终相同?
- 在一个大的显式事务中完成。不要强制数据库系统为每个插入创建新的隐式事务
- 使用事先准备好的陈述
- 好问题
除非您想将数组转换成一组规范化的表(听起来好像没有),否则您可能需要考虑序列化
序列化是一个花哨的词,用于将对象转换为某种格式,以便保存到磁盘或数据库。序列化的两种主要格式是二进制和XML,我打赌Java对它有一定的支持
根据使用的数据类型,您应该能够将数组转换为XML或二进制,然后将其保存到数据库中的单个字段中。您可以通过签出在Java中开始使用此技术。我知道它内置在.NET中
希望这有帮助。如果我能给你更多的指导,请告诉我。如何将数据存储为BLOB并使用Java将BLOB解码为实际的Java数组?在一次吞咽中存储和检索整个数组会更加高效,但在处理单个元素时会非常糟糕。PostgreSQL内置了对数组的支持
提出一种内部表示法——可以是XML、JSON、您自己提出的一些二进制文件,也可以是任何其他形式的序列化 使用“blob”数据类型将其存储在表中。将与矩阵关联的任何元数据存储在其他列中 我强烈反对这样做,即创建一个与矩阵行数和列数相同的表——这是为不使用的功能付出的高昂代价
事先准备好insert/select语句,并使用bind变量更改正在使用的矩阵——不要让db重新分析每个请求。如果它只是一个数组,为什么不使用二进制文件呢?正如allready建议的那样:如果不需要这些功能,就不要使用RDBMS。虽然您可能希望简化一个低级API,例如提供一些类似数据库的功能,如管理磁盘上的索引,而不是序列化。如果您的数据是密集的(值直方图接近于平线),最好的选择是使用对象[Output/Input]流进行blob和序列化 否则,您可能会发现使用稀疏数组和实体属性值模式的变体更有效。以下是一个例子:
Name | IndexKey | Value
------+-----------+-------
foo | 'default' | 39
foo | 0:0:0 | 23
foo | 0:0:1 | 34
foo | 1:5:0 | 12
...
bar | 1:3:8 | 20
bar | 1:3:8 | 23
bar | 1:1:1 | 24
bar | 3:0:6 | 54
...
这还允许您快速更新表的某些部分,并使用SQL“like”操作符选择切片
如果您的维度数是固定的,将键列分解为每个维度的独立int列,以提高索引效率并具有更灵活的选择标准(您可以对元数据使用第一个索引“null”,如默认值)
在任何情况下,在Name、IndexKey列上创建聚集索引都是一个好主意。将Java序列化为存储为BLOB的字节数组将是最佳选择。Java将非常高效地序列化大型数组。将其余的行和列用于您感兴趣的查询或显示内容。如果您对非BLOB数据进行大量查询和报告(尽管这可能因数据库实现而异),最好将BLOB保留在自己的表中,并让“常规”行指向“BLOB”行。HSQLDB 2.0支持作为表列存储的一维数组。因此,表的每一行将对应于2D数组的一行
但是,如果您想从整体上检索2D数组,BLOB是最好的解决方案。您需要随机访问数组元素还是只访问数组?您知道PostgreSQL的解决方案吗?不,维度不会保持不变。如果维度不相同,则必须使用如下所述的序列化。如果维度不保持不变,我也会这样做。一直创建和删除表是没有意义的。这是一个非常好的观点(尽管OP指定了其他一些db,这可能没有PostgreSQL在这方面惊人的灵活性)。您知道这项工作的实施效率吗?我得到的印象是,它并不适用于大型阵列,但我可能错了。MySQL和MicrosoftSQL中是否有与PSQ的阵列类型等效的类型?