2010-03-16 69 views
0

以下問題:我想根據本地化的文本呈現短消息的新聞流。在這些消息的各個地方,我必須插入參數來「定製」它們。我想你知道我的意思;)Java數據結構使用Hibernate來存儲未知數量的參數?

我的問題很可能落入「哪是做的最好的風格?」類別:如何在數據庫中存儲這些參數(它們可能是需要根據區域設置格式化的字符串和數字)?我使用Hibernate的人ORM,我可以認爲以下解決方案:

  • 構建組合的字符串,並將其保存爲這樣的(醜陋不堪,維護我認爲)
  • 做一些花哨的正常化,並在數據庫中每一個參數單行(乾淨的我猜,但性能惡夢)
  • 把PARAMS爲Array,地圖或其他Java數據結構,並將其保存在二進制格式(可能會導致很多的開銷大小明智)

我傾向於選項#3,但我afr從數據庫的大小來看,這可能會代價高昂。你怎麼看?

回答

3

如果你能負擔得起使用具有單獨的表我會用這種方法去的歸一化方法的性能損失。我們使用與您在工作中的第一個建議相同的方法,並且它得到凌亂,特別是當您達到列限制和鍵/值開始被截斷時!

+0

我想在我的情景中,速度比內存更重要。在相當短的時間段內會有成千上萬條這樣的消息,所以我非常害怕對性能的影響。我之前使用過「組合字符串」的方法,這在多方面都是很嚴重的。 我是否正確地說「串行化數據結構方法」的最大缺點是內存開銷? – Lunikon 2010-03-16 09:30:50

+0

在數據庫中使用序列化數據的缺點是,每次解序列化時都必須將所有數據加載到內存中(如果您有大量數據,這可能會造成問題),而且您也無法進行查詢在序列化的列上。如果你的數據是標準化的,你可以選擇你需要的數據,但是你的性能會降低。 – 2010-03-16 10:13:02

+0

儘管我不需要對這些參數進行查詢(它們僅用於顯示),而且數量不是太高,我想我會嘗試你的方法。看起來其他人似乎也是這樣想的。正如我想添加某種標籤系統一樣,我也許能夠以某種方式組合這些標籤系統。 – Lunikon 2010-03-16 22:24:03

0

直接把它作爲字符串,並將其保存..

1

做正常化。 我建議是這樣的:

表信息 ID

表PARAMS MESSAGE_ID 鍵 值

在數據庫中存儲序列化的Java對象是在大多數情況下,相當多的壞事。由於它們很難維護,並且無法使用'簡單'SQL工具訪問它們。

對性能的影響是不一樣大,你可以獲取所有在一個單一的共同選擇使用連接。

1

這取決於一點。每個實體的參數數量是多少?如果不可能,第二選擇是最好的。

如果你不想添加所造成的延遲加載,你可以隨時改變的,只會增加一個連接到查詢你總是做參數變量號取出類型額外查詢。在正常情況下,這不是一個很大的代價。

此外,在第三和第一個永遠禁止任何類型過來的參數的查詢。未來的巨大技術債務我不願意支付。