2010-04-17 30 views
1

我正在研究分析音乐相似度的应用程序。为了做到这一点,我可以获取音频数据并将结果存储在txt文件中。对于每个音频文件,我创建2个文件,1个包含值和16个值(每个值可以像这样:2.7000023942731723),另一个文件包含16行,每行包含16个值,如前面所示。如何在MySQL中存储矩阵信息?

我想将这两个文件的内容存储在我的MySQL数据库的表中。

我的表如下所示:

Name varchar(100) 
Author varchar (100) 

为了添加这些2文件,我想我需要使用BLOB数据类型的内容:

file1 blob 
file2 blob 

我的问题是我应该如何将这些信息存储在数据库中?我正在使用Java,我有一个包含16个值(用于file1)的双数组和一个包含file2信息的矩阵。我是否应该将值作为字符串处理并将其添加到数据库中的列中?

感谢

回答

0

你需要查询数据(地说所有比2.7大的值),或者只是存储它(你总是从数据库装载整个文件)?

鉴于评论中的信息,我会将文件保存为BLOB或TEXT,就像其他答案中所述。您甚至不需要行分隔符,因为您可以对值列表执行模数运算以获取矩阵的行。

+0

我只需要存储。此时此信息存储在2个.txt文件中。当我需要阅读这些文件时,我总是需要阅读所有的值。我只是想知道如何使用MySQL而不是使用文本文件。感谢您的信息 – dedalo 2010-04-17 13:08:15

1

我想你需要像这样规范化一个模式,如果你打算将它保存在关系数据库中。

听起来就像你有一个与其文件具有一对多关系的矩阵表。

如果你坚持使用一个非规范化表格,一种方法是将文件名称,作者名称,矩阵名称以及它的行和列位置存储在拥有它的已命名矩阵中。

请澄清一件事:这是线性代数意义上的矩阵吗?一个数学实体?

如果是,并且您只使用整个矩阵,那么也许可以将它作为一个blob存储在单个列中。这仍然会迫使您在每次进入数据库并从数据库中出来时序列化和反序列化为字符串或Blob。

+0

我不完全理解你。表中的每一行都包含一个文件的名称,它的作者和我想添加提取的信息,现在存储在.txt文件中。 – dedalo 2010-04-17 13:13:22

+0

好吧,想象我只是想在一个表中的矩阵(16×16)的列来存储,我怎么能这样做呢?在MySQL中创建此列时应使用哪种数据类型? – dedalo 2010-04-17 14:30:09

+0

+1我还会建议一个博客。对于一些非常简单的东西来说,这看起来很多。将矩阵转换为csv字符串并存储它可能会更容易。 – 2010-04-18 15:40:50

1

希望我不会因为这个疯狂的回答而被消极地重演,但我正试图在盒子外面思考。我的第一个问题是,如何在潜在查询后处理这些数据?如果我正在做类似的事情,我可能会使用类似matlab或八度音程的东西,它们有一个用于表示基音的特定符号。它基本上是一串逗号和分号分隔的文本,并在正确的位置加上方括号。我会存储一个字符串,我的数学软件或模块可以本地解析。毕竟,它听起来并不像你想要基于数据点做某种查询。

+0

我正在使用Java。这些数据用于执行数学运算。我想知道是否无论如何在表格的一列中存储矩阵(16x16)。 – dedalo 2010-04-17 14:26:44

+0

我仍然将它作为字符串以易于解析的格式存储。也许使用空格分隔列,用分号分隔行。这样,您就没有点号,逗号和工程记号的数字问题。使用split来获取行,然后在这些行上拆分以获取单元格很简单。 – Dave 2010-04-17 16:13:14

+0

任何东西都可以被解析,但如果你做了很多的操作与矩阵,你为什么要花费CPU周期的建筑弦上的方式和解析的出路?另一种方法意味着JOIN,但至少数据仍然是原生类型。如果您想要对特定行或列进行操作,该怎么办?一个JOIN使得这一切变得容易;一个BLOB使它变得很痛苦。 – duffymo 2010-04-18 21:44:27

0

我认为dedalo面临的问题是他正在处理数组(我假设一个是锯齿状的,一个是多维的),并且他想将这些数据序列化为blob。

但是,数组不是直接可序列化的,所以他问如何去做这件事。

去它会遍历数组,并建立一个字符串作为戴夫建议和存储字符串的最简单方法。正如duffymo指出的那样,这将允许您从数据库中的值中查看内容,而不是在需要时将数据反序列化。

如果您想知道如何将数组序列化为BLOB ...(这似乎只是矫枉过正)

你能够serialize one-dimensional arraysjagged 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

选择满足e最好的取决于序列化对象的大小。我想像BLOB会很好。

+0

嗨,此时此信息存储在txt文件中。这只是罚款。但是,我的经理希望我尝试将其存储在MySQL表中。起初,我考虑过这样做,因为戴夫建议,但我想知道是否有可能将文件添加到数据库,或者如果有任何其他方式这样做。 谢谢 – dedalo 2010-04-19 12:33:14

+0

此代码显示如何序列化阵列。您应该能够像使用任何其他SQL一样将Stream对象写入表中,您只需将数据类型指定为BLOB即可。如果这是一个如何获得一个字节数组到数据库的问题,请查看http://www.java2s.com/Code/Java/Database-SQL-JDBC/InsertpicturetoMySQL.htm我想你的问题有点难以理解。 – 2010-04-19 12:52:28