2016-12-20 32 views
0

我在內存中有一個堆棧數據結構。我將如何將這些數據保存到數據庫中。我可以使用任何格式的json,xml或專有格式。一旦它被序列化並持續存在,我需要一種反序列化並存儲在內存中的方法。我想我可以使用普通的JSON數組來存儲,但想問問是否有更好的想法。如何將隊列和堆棧保存到數據庫中

+0

我正在使用mysql – Luke101

+0

您的應用程序或其他人需要查詢隊列/堆棧時,他們存儲在數據庫中?如果是,二進制格式將阻止查詢。 –

+0

我的應用程序將查詢隊列。我想你是正確的。我會試試你的方式和大衛。我會看看哪一個效果最好。 – Luke101

回答

1

堆棧只是一個有序的項目序列。

您可以將任何數據庫中的所有項目存儲在一張表中,並添加一列以維護訂單。

例如,如果你需要存儲一個人,有姓名,你可以使用表

Field  Type 
--------------- 
name  varchar 
surname varchar 
position int 

您可以檢索在同一順序的元素與查詢像

select name, surname from persons order by position 

然後你可以建立你的堆棧插入所有的項目。


JSON格式編組數據不存儲在文本字段(VARCHAR或LONGTEXT)。如果你真的需要處理JSON數據,你可以使用新的json datatype可從MySQL 5.7.8:

在MySQL 5.7.8,MySQL支持原生JSON數據類型,允許在JSON有效地訪問數據( JavaScript對象表示法)文檔。 JSON數據類型相比將JSON格式的字符串存儲在字符串列中提供了這些優勢:

自動驗證存儲在JSON列中的JSON文檔。無效的文檔會產生錯誤。

優化的存儲格式。存儲在JSON列中的JSON文檔將轉換爲允許快速讀取文檔元素的內部格式。當服務器稍後必須讀取以二進制格式存儲的JSON值時,不需要從文本表示中解析該值。二進制格式的結構使服務器能夠直接通過鍵或數組索引來查找子對象或嵌套值,而無需讀取文檔中之前或之後的所有值。

0

有兩種方法。

方法1如果您不需要訪問隊列/堆棧中的單個元素(您總是加載它們),那麼您只需存儲隊列/堆棧的序列化副本。或者,如果隊列/堆棧(或其元素)足夠複雜,則可以將其編組爲XML或JSON字符串。在這兩種情況下,您都可以將該字符串存儲到數據庫列(可能在longtext數據類型中)。當你需要的隊列/棧,你看從DB的字符串,然後反序列化或解組回一個Java隊列/棧。

對於JSON,你可以使用GSON(com.google.gson.Gson和朋友);爲XML,你可以,如果你需要訪問的各個元素(例如,它們將形成與其他一些實體的實體關係)使用JAXB(javax.xml.bind.JABContext和朋友)

方法2,那麼你應該映射您的隊列/棧(作爲一個集合)分成幾個數據庫表中的各個行。 Hibernate將是一個很好的工具。谷歌爲「休眠映射集合」

+0

對於方法2:您至少需要添加一個列位置來維護廣告訂單。存儲沒有這些信息的項目可以改變數據庫中重建堆棧的順序。另外使用像hibernate這樣的框架只是因爲你不能手動創建堆棧,這是一個非常糟糕的方法。 –