2017-09-02 51 views
0

我有一個Django的Web應用程序與Postgres的數據庫;一般的操作是每天都有一組需要存儲在其中一個表中的值。 沒有可預見的需要查詢數組的值,但需要能夠繪製特定日期的值。 問題是這個數組非常大,如果我將它存儲在數據庫中,我每年會有6000萬行,但是如果我將每行存儲爲一個blob對象,那麼每年將有6萬行。django數據庫設計時,你會有太多的行

是是使用Blob對象,以減少表的大小,當你不想與值的行來查詢一個很好的決定? 這裏有兩種選擇:

選項1:保持所有

group(foreignkey)| parent(foreignkey) | pos(int) | length(int) 
    A    | B     | 232  | 45 
    A    | B     | 233  | 45 
    A    | B     | 234  | 45 
    A    | B     | 233  | 46 
... 

選項2:摺疊數組到一個blob:

group(fk)| parent(fk) | mean_len(float)| values(blob) 
    A  | B   | 45   |[(pos=232, len=45),...] 
... 

,所以我不希望查詢POS或長度,但我想查詢組或父母。 一個是我說的讀取查詢的例子是:

SELECT * FROM "mytable" 
LEFT OUTER JOIN "group" 
ON ("group"."id" = "grouptable"."id") 
ORDER BY "pos" DESC LIMIT 100 

這是一個典型的Django管理list_view頁主查詢。

+1

如果真的沒有必要對數據進行查詢(使用SQL),然後是啊,只是存儲一個blob – Strawberry

+0

在另一方面 - 什麼是這種分組的好處是什麼?如果一個表格正確完成(索引等),那麼理論上應該沒有嚴重的性能差異。如果做得不正確,那麼規範化的表單應該會導致更快地發現問題。 (通過我可能是錯誤的,我沒有在實踐中這樣做,只是純粹的理論。) – Sasha

+0

有一些成長的行的性能情節會有幫助,但我找不到任何。我會試着嘲笑大數據來看看會發生什麼。 – max

回答

0

我試圖加載數據,並試圖顯示在Django管理頁面的表格沒有做任何複雜的查詢(只是讀查詢)。 當我通過150萬行時,管理頁面凍結。它只需要在該表上進行一些計數查詢來導致應用程序崩潰,所以我絕對應該將數據保存爲blob,或者不要將其保存在數據庫中,而是使用文件系統。

enter image description here

我想強調的是,我使用的Django 1.8作爲我的測試平臺,所以這是不是一個Postgres的評價,而是與Django管理和Postgres的系統評價。

+0

這是一個答案。歡迎提供其他建設性答案。我花時間來描述場景,提供架構示例並顯示性能變化。 – max

+0

謝謝,我明白了。 PS看到我對這個問題的評論。你爲什麼認爲一年中有60個變得太大?爲了什麼?爲什麼你要「顯示」數百萬行?什麼是「一些計數查詢」?什麼數據被用於什麼目的?您可以爲不同目的更新多個表格。你會得到更好,更具體的答案更清晰,更具信息性的問題。 – philipxy

+0

我明白你的觀點。我修改了我的問題和答案。我的意思是關注django,而不是一般的數據庫評估。 – max