2016-04-27 37 views
0

我正在研究包含來自不同傳感器的讀數的系統,其中一些傳感器可能包含比單個讀數更多的鍵。由於它們都是傳感器讀數,我正在尋找一張表來存放這些讀數,並且有一個用於主要讀數的字段,但是仍然需要存儲任何額外的信息。JSON與元數據表的性能

對於這些額外的信息,我正在考慮兩種解決方案之一,但是我想知道是否有人做過類似的事情,並且對兩者之間的性能差異有所瞭解。

選項1

儲存在傳感器讀數記錄本身內的JSONB列中的額外數據。我讀過PostgreSQL 9.4中添加的JSONB實現是非常好的,但是我不知道這對我的用例有多快(不確定我將要處理的記錄數量是多少又那麼很難衡量。)

選項2

創建副「元數據」有效表鍵值存儲。一列表示鍵,另一列表示值。這將允許我使用適當的索引,並且Postgres將能夠生成更準確的查詢計劃。

有誰知道這可能會表現更好嗎?我可能會做更多的插入記錄而不是讀取,而且當我進行讀取時,很可能會同時記錄很多記錄,而不僅僅是可能影響此決定的單個記錄。

我以爲選項2可能是更好的選擇,因爲它不是真正的非結構化數據,並有能力索引它是有益的,但如果有人可以確認/拒絕這個會很好。

+0

在你的情況下,我總是喜歡一個鍵值結構,但不能確認它是基於事實的,所以把它作爲你直覺的證實。 – LBA

+0

這是我的想法,雖然自從找到名稱(EAV),我正在閱讀大量的帖子,說這是一件可怕的事情,我應該添加多列,即使他們不使用? – PaReeOhNos

回答

0

我已經使用了兩者,它取決於您想要如何查詢數據。通常PostgreSQL在連接方面表現相當好。

而不是去選項2我會去完全規範化,即定義一個表SensorReading,具有鍵,值,對傳感器表的引用和時間戳。時間戳和sensor_id上的索引。這就是我的做法,它運作良好。

我已經使用選項1爲真正的大表,例如博客文章中的標籤。在這種情況下,你可以定義一個JSONB字段或一個數組。這不是真的,它會表現不好,你可以在這些字段上定義一個GIN數組(btree將是非常沒用的)。所以這兩個選項都可以編入索引。

所以我會開始完全規範化,然後在未來需要時進行非規範化。當然不是選項2,因爲你建議。

+0

單個表包含與包含相同鍵值對的相關表不同的鍵和值對嗎? – PaReeOhNos

+0

您提到要在主表中保留第一個鍵值對,並將其他鍵值對放在單獨的表中。我試圖做的一點是不這樣做,而是將所有鍵值對保留在同一個表中。 – tdma

+0

啊正確的陷阱。 – PaReeOhNos