2010-04-17 81 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