0

我有一個要求,在我的數據庫表中有612列。按數據類型列的#是:從一張繁重的表中DB設計和數據檢索

BigInt有 - 150(PositionCol1,PositionCol2 ............ PositionCol150)

INT - 5

SMALLINT - 5

日期 - 150(SourceDateCol1 ,SourceDate2,............ .SourceDate150)

日期時間 - 2

VARCHAR(2000) - 150(FormulaCol1,FormulaCol2 ... ............ FormulaCol150)

位 - 150(IsActive1,IsActive2,.................. .IsActive150)

當用戶執行用於導入第一次得到的數據存儲在PositionCol1,SourceDateCol1,FormulaCol1, IsActiveCol1等(其他日期時間,Int,Smallint列)。

當用戶執行導入的數據被存儲在PositionCol2,SourceDateCol2,FormulaCol2,IsActiveCol2等。(其他日期時間,INT,SMALLINT列)第二次... ..等等等等。

表中有一個ProjectID列正在導入數據。

在開始導入過程之前,用戶將excel列名與數據庫列名(PositionCol1,SourceDateCol1,FormulaCol1,IsActiveCol1)進行映射,並將此映射存儲在單獨的表中;這樣當檢索到的數據可以顯示在這些映射列名下面而不是數據庫列名時。例如。

PositionCol1可以被映射到SAPDATA

SourceDateCol1可以被映射到SAPDATE

FormulaCol1可以被映射到SAPFORMULA

IsActiveCol1可以被映射到SAPISACTIVE

40000行將在加入這張表每天都有,我的問題是,SQL能夠處理長期大量數據的負載嗎?

大多數時候,一行將有大約200-300列的數據;在最壞的情況下,它會在所有612列中有數據。爲保持這一點,我是否應該對設計進行一些更改以避免將來的性能問題?如果是這樣,請提出可以做些什麼?

如果我堅持我目前的設計,除了索引之外,我應該關注哪些要在從這張巨大的表中檢索數據時獲得最佳性能?

如果我需要檢索特定實體的數據,例如SAPDATA,我必須去我的映射表,在這種情況下獲取數據庫列名稱對SAPDATA,即PositionCol1;並檢索它。但是,這樣,我將不得不編寫動態查詢。還有其他更好的方法嗎?

回答

0

不要堅持你目前的設計。你的重複羣體不受限制和自我限制...當有人上傳151次會發生什麼?對此表進行規範化處理,以便每行有一種類型而不是150種。你不需要用這種方式進行映射,因爲你可以從positioncol中選擇SAPDATA而不用擔心,如果它是1-150。

您可能需要一個帶有ID的PROJECTS表,一個PROJECT_UPLOADS錶帶有一個ID和一個FK到PROJECTS表。根據上面的用例,此表將具有Position,SourceDate,Formula和IsActive。

然後,你可以做這樣的事情

選擇p.name,pu.position從項目p內加入PROJECT_UPLOADS濮上pu.projectid = p.id WHERE pu.position = 'SAPDATA'

+0

我已經用建議的設計燒了我的手指,因爲在動態查詢的幫助下,行必須旋轉到許多列的列中。所以,如果你有大量的數據,那麼這種設計是行不通的。 – user899055

+0

而且這些列是固定的,它們不會增加。另外,由於數據的存儲方式與我想要的方式相同,所以數據回覆速度非常快,因爲它不需要執行關鍵操作。 – user899055

+0

當你說「每天40,000行」時,有多少人會「活躍」?這是歷史數據嗎?您可以在大多數現代RDBMS中對數據進行分區,以最大限度地降低對性能的影響(取決於您的查詢的結構)。您可能需要考慮一個數據倉庫解決方案,因爲a)它可以幫助您瞭解您所建議的結構(即保持您的查詢簡單快捷),並且b)減少實時系統的負載。但是我並沒有真正理解你的用例,以便能夠提出可靠的建議。 –