BLOB vs. VARCHAR para armazenar matrizes em uma tabela MySQL

Doug:

Tenho que tomar uma decisão de design e estou procurando alguns conselhos sobre as melhores práticas. Eu tenho um programa java que precisa armazenar um grande número (algumas centenas por dia) de matrizes de ponto flutuante em um banco de dados MySQL. Os dados são uma Doublematriz de comprimento fixo de 300. Posso ver três opções razoáveis:

  1. Armazene os dados como um BLOB.
  2. Serialize os dados e armazene-os como um VARCHAR.
  3. Grave os dados no disco como um arquivo binário e armazene uma referência a ele.

Devo também mencionar que esses dados serão lidos e atualizados com freqüência.

Eu quero usar um BLOB, pois é o que eu fiz no passado e parece ser o método mais eficiente (por exemplo, mantém a largura fixa e não há necessidade de converter para uma string separada por vírgulas). No entanto, meu colega de trabalho está insistindo que devemos serializar e usar varchar por razões que parecem principalmente dogmáticas.

Se um desses métodos for melhor que o outro, os motivos do Java ou do MySQL são específicos?

Julius Musseau:

Armazene como um BLOB da mesma forma (veja o exemplo de código abaixo). Acho que isso é provavelmente melhor do que usar a serialização de java, já que a serialização interna de java precisará de 2427 bytes e os aplicativos não-java terão mais dificuldade em lidar com os dados. Ou seja, se algum dia houver algum aplicativo não Java consultando o banco de dados no futuro ... se não, a serialização embutida terá menos linhas.

public static void storeInDB() throws IOException, SQLException {

    double[] dubs = new double[300];

    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    DataOutputStream dout = new DataOutputStream(bout);
    for (double d : dubs) {
        dout.writeDouble(d);
    }
    dout.close();
    byte[] asBytes = bout.toByteArray();

    PreparedStatement stmt = null;  // however we normally get this...
    stmt.setBytes(1, asBytes);

}

public static double[] readFromDB() throws IOException, SQLException {

    ResultSet rs = null;  // however we normally get this...
    while (rs.next()) {
        double[] dubs = new double[300];
        byte[] asBytes = rs.getBytes("myDoubles");
        ByteArrayInputStream bin = new ByteArrayInputStream(asBytes);
        DataInputStream din = new DataInputStream(bin);
        for (int i = 0; i < dubs.length; i++) {
            dubs[i] = din.readDouble();
        }
        return dubs;
    }

}

Editar: eu esperava usar BINARY (2400), mas o MySQL diz:

mysql> create table t (a binary(2400)) ;
ERROR 1074 (42000): Column length too big for column 'a' (max = 255);
use BLOB or TEXT instead

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Como armazenar respostas para uma tabela MySQL

Como armazenar respostas para uma tabela MySQL

MYSQL, copie dados de uma tabela para outra tabela com incremento em varchar

Como direcionar o MySQL para não armazenar em cache uma tabela na memória?

Como faço para armazenar minha 'visualização' como uma tabela permanente em mySQL?

Maneira mais eficiente de armazenar VARCHAR em uma tabela de 150B-linhas

Como posso dividir uma string para armazenar o conteúdo em duas matrizes diferentes em c #?

crie uma matriz multidimensional para armazenar muitas matrizes de tamanhos diferentes em C

Como armazenar vetores médios e matrizes de covariância em células de uma tabela de dados?

Como faço para armazenar a tabela resultante de uma consulta SELECT em uma variável?

Precisa de ajuda para armazenar o esquema de uma tabela em uma variável no SSIS

Como armazenar um datagridview como um array em uma célula de uma tabela mysql

Como você inicializa uma tabela de hash para armazenar em um arquivo em C

Combine duas matrizes NumPy em uma matriz estruturada para anexar a uma tabela PyTables

Colocando matrizes em uma tabela usando PHP

Usando matrizes para preencher uma tabela

armazenar produto e categoria em uma tabela é bom ou podemos usar uma tabela separada para categoria e produto?

um algoritmo para armazenar '{' e '}' em duas matrizes em javascript

Como exportar / armazenar em spool uma tabela grande para um arquivo no Oracle

Qual é uma boa prática para armazenar contagens de linhas em outra tabela?

Existe um método eficiente para armazenar cabeçalhos de tabela em uma coleção VBA?

Como armazenar a saída em uma lista de matrizes

Como faço para inserir em uma tabela os valores de duas matrizes no Postgres?

Encontre uma string na tabela MySQL por meio de um loop em várias matrizes

como usar sessões e matrizes em uma consulta ao banco de dados para armazenar e exibir dados

Como faço para armazenar a sequência de matrizes 2D em uma matriz 3D no Matlab?

Como usar Spring Cache para armazenar uma tabela MySQL e usá-la para uma chamada de banco de dados

como armazenar dados em matrizes, use funções para

Usando Scanf para armazenar entrada em matrizes 2d

TOP lista

quentelabel

Arquivo