代码之家  ›  专栏  ›  技术社区  ›  Anand

在数据库中存储阵列

  •  11
  • Anand  · 技术社区  · 17 年前

    在数据库(例如hsqldb)中存储大型阵列(10000x100)最有效的方法是什么?我需要为我正在用java编写的某个数学程序这样做。请帮忙。 整个数组将经常被检索和存储(而不是单个元素)。此外,还需要存储有关阵列的一些元数据。

    11 回复  |  直到 17 年前
        1
  •  15
  •   Ed Altorfer    17 年前

    好问题。

    除非您想将数组转换成一组规范化的表(听起来好像没有),否则您可能需要考虑序列化。

    序列化是一个花哨的词,用于将对象转换为某种格式,以便保存到磁盘或数据库。序列化的两种主要格式是二进制和XML,我打赌Java对它有一定的支持。

    根据使用的数据类型,您应该能够将数组转换为XML或二进制,然后将其保存到数据库中的单个字段中。您可以通过签出 http://java.sun.com/developer/technicalArticles/Programming/serialization/

    希望这有帮助。如果我能给你更多的指导,请告诉我。

        2
  •  8
  •   Barry Brown    17 年前

        3
  •  2
  •   SquareCog    17 年前

    提出一个内部表示——可以是XML、JSON、您自己提出的一些二进制文件,或者任何其他形式的序列化。

    使用“blob”数据类型将其存储在表中。将与矩阵关联的任何元数据存储在其他列中。

    我强烈反对这样做,即创建一个与矩阵行数和列数相同的表——这是为不使用的功能付出的高昂代价。

    事先准备好insert/select语句,并使用bind变量更改正在使用的矩阵——不要让db重新分析每个请求。

        4
  •  1
  •   Toon Krijthe    17 年前

    如果它只有一个数组,为什么不使用二进制文件呢?

        5
  •  1
  •   John Nilsson    17 年前

    正如allready所建议的:如果不需要这些特性,就不要使用RDBMS。而不是序列化,尽管您可能希望简化一个低级API,如 JDBM 它提供了一些类似数据库的功能,如管理磁盘索引。

        6
  •  1
  •   ddimitrov    17 年前

    如果数据是密集的(值直方图接近于平线),那么最好的选择是使用对象[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列上创建聚集索引。

        7
  •  0
  •   Nick    17 年前

    使用数组所保存的数据定义一个表,并将数组值插入表中。

    这是非常简单的数据访问/存储。您的数组维度是否始终相同?

        8
  •  0
  •   yfeldblum    17 年前
    • 在一个大的显式事务中完成。不要强制数据库系统为每个插入创建新的隐式事务。
    • 使用事先准备好的陈述。
        9
  •  0
  •   Barry Brown    17 年前

    PostgreSQL内置了对数组的支持。

    http://www.postgresql.org/docs/8.0/interactive/arrays.html

        10
  •  0
  •   Will Hartung    17 年前

        11
  •  0
  •   fredt    15 年前

    HSQLDB2.0支持存储为表列的一维数组。因此,表的每一行将对应于2D数组的一行。

    但是,如果您想从整体上检索2D阵列,BLOB是最好的解决方案。