我正在开发一个分析音乐相似度的应用程序。为了做到这一点,我处理音频数据并将结果存储在txt文件中。对于每个音频文件,我创建2个文件,1个包含16个值(每个值可以是这样:2.7000023942731723),另一个文件包含16行,每行包含16个值,如前面所示。
我想将这两个文件的内容存储在MySQL数据库的表中。
我的表格如下:
Name varchar(100)
Author varchar (100)
为了添加这两个文件的内容我认为我需要使用BLOB数据类型:
file1 blob
file2 blob
我的问题是我应该如何在数据库中存储此信息?我正在使用Java,我有一个包含16个值的double数组(对于file1)和一个包含file2信息的矩阵。我应该将值作为字符串处理并将它们添加到我的数据库中的列吗?
由于
答案 0 :(得分:1)
如果您打算将其保存在关系数据库中,我认为您需要规范化这样的模式。
听起来你有一个与其文件有一对多关系的矩阵表。
如果你坚持使用一个非规范化表,那么一种方法就是存储文件的名称,作者,矩阵的名称,以及它拥有它的命名矩阵中的行和列位置。
请澄清一件事:这是线性代数意义上的矩阵吗?一个数学实体?
如果是,并且您只使用整个矩阵,那么也许您可以将它作为blob存储在单个列中。这仍然会强制您在每次进入和离开数据库时序列化和反序列化为字符串或blob。
答案 1 :(得分:1)
希望我不会因为这个疯狂的回答而得到消极的谴责,但我试图跳出框框思考。我的第一个问题是,如何在潜在查询后处理这些数据?如果我做了类似的事情,我可能会使用像matlab或octave这样的东西,它们有一个特定的表示法来表示基质。它基本上是一串逗号和分号分隔的文本,右边有方括号。我会存储一个我的数学软件或模块可以解析的字符串。毕竟,听起来你不想根据数据点进行某种查询。
答案 2 :(得分:0)
您是否需要查询数据(例如所有大于2.7的值)或只是存储它(您总是从数据库加载整个文件)?
鉴于评论中的信息,我会将文件保存在BLOB或TEXT中,如其他答案所述。您甚至不需要行分隔符,因为您可以对值列表执行模数运算以获取矩阵的行。
答案 3 :(得分:0)
我认为dedalo面临的问题是他正在使用数组(我假设一个是锯齿状的,一个是多维的)并且他想将这些数组序列化为blob。
但是,数组不能直接序列化,所以他在问这个问题。
最简单的方法是循环遍历数组并构建一个Dave建议的字符串并存储字符串。这将允许您从数据库中的值查看内容,而不是在需要进行反序列时反序列化数据,正如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
选择最佳的一个取决于序列化对象的大小。我想BLOB
就足够了。