2012-11-13 123 views
4

我是postgres的新手,正在嘗試使用hstore擴展。尋找一些指導。我需要支持我們銷售的各種產品的時間序列數據的基本報告。每種產品都有「時間戳,值」格式的大量數據。這些數據可以在每種產品的csv文件中找到。Postgres hstore時間序列

我正在考慮使用hstore以鍵值格式存儲這些數據。假設單個產品的所有時間序列數據都可以存儲在單個hstore對象中。我需要能夠在特定時間查詢這些數據,說明某個產品在特定時間的價值是多少?還需要運行簡單的查詢,例如檢索產品成本超過100美元的時間。 我打算有一個產品ID列和hstore列的表。但我不清楚如何使這項工作:

  1. hstore列需要從成千上萬的時間戳,csv中存在的價值記錄加載。每當我們獲得新的csv時,hstore應該被追加。
  2. 該表需要存儲productId和相應的時間序列數據。 你可以請建議,如果使用hstore會有幫助嗎?如果是,那麼我怎麼能如上所述加載來自csv的數據。此外,如果可能對hstore中插入/更新的性能產生任何影響,隨着數據量的增長,請分享您的體驗。
+0

我同意Edmnud。 「hstore」不是這份工作的好選擇。如果時間值位於hstore內,則無法有效地使用b-tree索引。更重要的是,更新hstore需要將整個hstore重新寫入新的行版本,與在子表中插入/更新/刪除單個值相比,這非常昂貴。如果值位於hstore中,則不能使用排除約束來防止時間重疊。我看不出有什麼理由在這裏使用hstore,並且沒有任何理由。 –

回答

3

我認爲你應該從一個簡單的,規範化的模式開始,特別是因爲你是PostgreSQL的新手。喜歡的東西:

CREATE TABLE product_data 
(
    product TEXT, -- I'm making an assumption about the types of your columns 
    time TIMESTAMP, 
    value DOUBLE PRECISION, 

    PRIMARY KEY (product, time); 
); 

我肯定會記住hstore和類似的選項,如果當你的數據變得足夠大,使得效率更重要,更簡單。但請注意,所有選項都有效率折衷。

你知道你要支持多少數據嗎?產品數量,每種產品的不同時間戳數量?

你想運行哪些其他查詢?如果產品具有多個不同的時間戳,那麼查詢單個產品成本超過100美元的時間將從(product, value)的索引中受益。如果你想存儲任意鍵 - 值對的表設置在一排

其他選項

hstore是最有用的。你可以在這裏使用它,每個產品都有一行,每個產品的不同時間戳都是產品表中的關鍵。缺點是hstore中的鍵和值是文本,而您的鍵是時間戳,而您的值是某種類型的數字。所以型式檢驗會有一定程度的減少,而且所需的型號鑄造成本會有一定的增加。另一個可能的缺點是對hstore的某些查詢可能不會非常有效地使用索引。上表可以使用簡單的btree索引進行範圍查詢(例如,您想要爲產品的兩個日期之間提取值)。但是,hstore索引更加有限;您可以在hstore列上使用gist或gin索引來查找具有某個鍵的所有行。

另一種選擇(我已經玩過並用於我的一些數據庫的實驗)是數組。基本上,每個產品都有一個值數組,每個時間戳映射到數組中的一個索引。如果時間戳非常規則,這很容易。例如,如果你所有的產品有一個值,每隔一小時,每一天,你可以使用一個表是這樣的:

CREATE TABLE product_data 
(
    product TEXT, 
    day DATE, 
    values DOUBLE PRECISION[], -- An array from 0 to 23. 

    PRIMARY KEY (product, day); 
); 

您可以構建視圖和索引,使查詢該表溫和容易。 (我在http://ejrh.wordpress.com/2011/03/20/vector-denormalisation-in-postgresql/上寫了一篇關於這項技術的博客文章。)

但是我的建議仍然是:從一張簡單的表開始,然後探索提高效率的方法,當你知道你需要它們時。

+1

謝謝Edmund&Craig,非常有用的信息。我們需要支持多達一百萬種產品,並且對於每種產品,我們需要隨時間存儲多達10種不同屬性,例如:成本,視圖,客戶數量等。數據收集的頻率是可變的,並在產品級別。它不是一個固定的頻率,但是我們需要規劃一個頻率低至每個產品每5分鐘〜525600個值。看起來在使用hstore時,會出現讀取和寫入問題。我們需要支持長達一年的報告。有任何想法嗎?請指教。 – zing