2010-04-17 2 views
1

Я работаю над приложением, которое анализирует сходство музыки. Для этого я обрабатываю аудиоданные и сохраняю результаты в txt-файлах. Для каждого аудиофайла я создаю 2 файла, 1 содержит и 16 значений (каждое значение может быть таким: 2.7000023942731723), а другой файл содержит 16 строк, каждая строка содержит 16 значений, как показано ранее.Как хранить информацию о матрицах в MySQL?

Я хотел бы сохранить содержимое этих 2 файлов в таблице моей базы данных MySQL.

Моя таблица выглядит следующим образом:

Name varchar(100) 
Author varchar (100) 

для того, чтобы добавить содержание этих 2 файла я думаю, что нужно использовать тип BLOB данных:

file1 blob 
file2 blob 

Мой вопрос, как я должен хранить эту информацию в базе данных? Я работаю с Java, где у меня есть двойной массив, содержащий 16 значений (для файла1) и матрицу, содержащую информацию file2. Должен ли я обрабатывать значения как строки и добавлять их в столбцы в моей базе данных?

Благодаря

ответ

0

вам необходимо запросить данные (скажем, для всех значений, которые больше, чем 2.7) или просто хранить его (вы всегда загружать весь файл из базы данных) ли?

Учитывая информацию в комментарии, я бы сохранил файлы в BLOB или TEXT, как сказано в других ответах. Вам даже не нужен разделитель строк, так как вы можете выполнять операцию модуля в списке значений, чтобы получить строку матрицы.

+0

Мне просто нужно его хранить. Сейчас эта информация хранится в 2 файлах .txt. Когда мне нужно прочитать эти файлы, мне всегда нужно прочитать все значения. Я просто хочу знать, как это сделать, используя MySQL вместо использования текстового файла. Спасибо за сообщение – dedalo

1

Я думаю, вам нужно нормализовать схему, как это, если вы намерены сохранить ее в реляционной базе данных.

Похоже, у вас есть таблица матриц, которая имеет отношения «один ко многим» со своими файлами.

Если вы настаиваете на одной денормализованной таблице, один из способов сделать это - сохранить имя файла, его автора, имя его матрицы и его позицию в строке и столбце в названной матрице, которая его владеет.

Просьба пояснить одно: Является ли это матрицей в смысле линейной алгебры? Математическая сущность?

Если да, и вы используете только матрицу целиком, то, возможно, вы можете сохранить ее в одном столбце в виде капли. Это все равно заставляет вас сериализовать и десериализовать строку или blob каждый раз, когда она входит и выходит из базы данных.

+0

Я не совсем понимаю вас. Каждая строка в таблице содержит имя файла, его автора, и я хочу добавить извлеченную информацию и которая теперь хранится в файлах .txt. – dedalo

+0

ok, представьте, я просто хочу хранить в столбце таблицы матрицу (16x16), как я мог это сделать? какой тип данных я должен использовать, когда создаю этот столбец в MySQL? – dedalo

+0

+1 Я собирался предложить блог также. Это просто похоже на обработку очень просто. Может быть проще преобразовать матрицу в строку csv и сохранить это. –

1

Надеюсь, что я не получаю отрицательный ответ, забвенный этим сумасшедшим ответом, но я стараюсь думать нестандартно. Мой первый вопрос: как вы обрабатываете эти данные после потенциального запроса? Если бы я делал что-то подобное, я бы, скорее всего, использовал нечто вроде matlab или октавы, которые имеют определенную нотацию для представления матриц. Это в основном куча текста с запятой и точкой с запятой с квадратными скобками в правильных местах. Я бы сохранил только строку, которую мое математическое программное обеспечение или модуль может анализировать изначально. В конце концов, это не похоже на то, что вы хотите сделать какой-то запрос на основе точки данных.

+0

Я работаю с Java. Эти данные используются для выполнения математических операций. Мне было интересно, если в любом случае хранить матрицу (16x16) в столбце таблицы. – dedalo

+0

Я бы сохранил его в легко анализируемом формате, как строку. Возможно, используйте пробелы для разделения столбцов и точки с запятой для разделения строк. Таким образом, у вас нет проблем с номерами с точками, запятыми и инженерными обозначениями. И просто использовать split для получения строк, а затем разделить на эти строки, чтобы получить ячейки. – Dave

+0

Все может быть проанализировано, но если вы делаете много операций с матрицей, зачем вам тратить циклы CPU на построение строк на пути и разбор на выходе? Альтернативный вариант JOINs, но по крайней мере данные по-прежнему находятся в собственном типе. Что делать, если вам нужна операция с определенной строкой или столбцом? A JOIN делает это легко; BLOB делает его болью. – duffymo

0

Я думаю, что проблема, с которой сталкивается дедало, заключается в том, что он работает с массивами (я предполагаю, что один из них зубчатый, один - многоразмерный), и он хочет сериализовать их на blob.

Но массивы не являются непосредственно сериализуемыми, поэтому он спрашивает, как это сделать.

Простейший способ сделать это - это перебрать массив и построить строку, как предложил Дейв и сохранить строку. Это позволит вам просматривать содержимое из значения в базе данных, а не десериализовать данные всякий раз, когда вам нужно вставить его, как указывает duffymo.

Если вы хотите знать, как сериализовать массив в BLOB ... (это просто кажется излишним)

Вы можете serialize one-dimensional arrays и jagged arrays, например:

public class Test { 
    public static void main(String[] args) throws Exception { 

     // Serialize an int[] 
     ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("test.ser")); 
     out.writeObject(new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}); 
     out.flush(); 
     out.close(); 

     // Deserialize the int[] 
     ObjectInputStream in = new ObjectInputStream(new FileInputStream("test.ser")); 
     int[] array = (int[]) in.readObject(); 
     in.close(); 

     // Print out contents of deserialized int[] 
     System.out.println("It is " + (array instanceof Serializable) + " that int[] implements Serializable"); 
     System.out.print("Deserialized array: " + array[0]); 
     for (int i=1; i<array.length; i++) { 
      System.out.print(", " + array[i]); 
     } 
     System.out.println(); 
    } 
} 

Что касается того, что тип данных для хранения как в MySQL, there are only four blob types to choose from:
The four BLOB types are TINYBLOB, BLOB, MEDIUMBLOB, and LONGBLOB

Choos e лучший зависит от размера сериализованного объекта. Я бы предположил, что BLOB будет достаточно хорошим.

+0

Привет, В этот момент эта информация хранится в txt-файлах. Это работает только штрафы. Однако мой менеджер хочет, чтобы я попытался сохранить его в таблице MySQL. Сначала я думал о том, чтобы сделать это, как предложил Дейв, но я хотел бы знать, можно ли добавить файл в базу данных или если есть другой способ сделать это. Thanks – dedalo

+0

Этот код показывает, как сериализовать массив. Вы должны иметь возможность записывать объект Stream в таблицу так же, как и с любым другим SQL, вам просто нужно указать тип данных как BLOB.Если речь идет о том, как получить массив байтов в базе данных, посмотрите http://www.java2s.com/Code/Java/Database-SQL-JDBC/InsertpicturetoMySQL.htm. Я думаю, ваш вопрос был немного трудно понять , –

Смежные вопросы