Как хранить матричную информацию в MySQL? - PullRequest
1 голос
/ 17 апреля 2010

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

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

Мой стол выглядит так:

Name varchar(100)
Author varchar (100)

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

file1 blob
file2 blob

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

Спасибо

Ответы [ 4 ]

1 голос
/ 17 апреля 2010

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

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

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

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

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

1 голос
/ 17 апреля 2010

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

0 голосов
/ 19 апреля 2010

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

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

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

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

Вы можете сериализовать одномерные массивы и зубчатые массивы , например ::

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, есть только четыре типа BLOB-объектов на выбор :
The four BLOB types are TINYBLOB, BLOB, MEDIUMBLOB, and LONGBLOB

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

0 голосов
/ 17 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...