2015-11-05 158 views
0

SQL表每個月我從需要被存儲在數據庫中的外部公司,含有高達一百萬條記錄的每個文件發送的文件。主要數據字段是月份,年份,郵政編碼和交易類型。創建的年份和月份

我建議我們應該將數據保存在數據庫中作爲每個月的新SQL表,這樣我們就知道每個表中只有有限的數據量。然而,我的一個同事說,他曾經被告知每月創建一張新桌子是不好的做法,但他不知道爲什麼。

如果我有多個表格,最多隻能有60個表格,但可能會少得多(低至12),具體取決於我的客戶需要查看的過去的距離。這意味着每個月我都需要刪除一個月的數據。

但是,當我做我的SQL查詢時,我將只需要從每個查詢單個表中的單行數據。從理論上講,我認爲這會比填充數百萬行的單個表更有效率。

我想知道是否有人有任何明確的理由,爲什麼以這種方式分解數據將是一件壞事?

+0

如果只有一個表,運行select查詢就簡單多了。 –

+0

這個問題可能很快就會被重複關閉。如果來自副本的答案(如http://stackoverflow.com/a/21283725/3854195)沒有完全解決您的問題,請編輯它以包括爲什麼並標記爲重新打開。謝謝! – Morpheus

回答

2

所有的「喜歡」的物品應存放在一起,原因如下數據庫:僅通過改變WHERE條款

  • 你應該能夠提供使用單個SELECT語句中的項的任何子集的聲明。使用單獨的表格,您必須編寫代碼將請求分解爲計算表名稱和過濾該表格的部分。你將不得不在每個應用程序中複製該邏輯,或者教給每個想要使用數據庫的用戶。

  • 您不應該人爲地限制數據的使用。如果您有單獨的每月表格,則您已經大大限制了您可以針對它們輸入的查詢類型,而無需編寫更復雜的UNION查詢。

  • 增加了一個已知的數據類型數據庫的多個實例不應要求ALTER荷蘭國際集團數據庫的結構,作爲一般原則,定期運行的代碼甚至不應該有ALTER權限

  • 如果維護了合適的索引,那麼當來自表格60倍於較小表格大小的數據時,性能差異非常小。 (對INSERTUPDATE命令可能會有更多的影響,但聽起來好像您將進行批量更新而不是不斷更新數據)。

我能想到的只有兩個原因分片數據轉換成獨立的表:

  • 你發現你有一個性能問題無法通過更好的數據設計來解決。

  • 您擁有不同安全級別的記錄,並且依賴GRANT SELECT權限允許某些用戶在更高級別的安全級別上查看記錄。

+0

實際上會有權限組,但它們是在郵政編碼上指定的。這應該成爲數據庫表格設計的一個因素嗎? – RyuAkamatsu

+0

取決於您需要的安全級別和您的應用程序的性質。絕對安全性只能通過根據安全級別劃分數據,然後適當授予訪問權限來保證。 [您可以創建'VIEW'來隱藏數據和'GRANT';我不知道這是否在MySQL中可用]。否則,您將依賴於應用程序級邏輯來隱藏用戶的數據。 –

0

一個更簡單的方法是將一列添加到該表中,該表包含加載到系統中的日期時間戳。您可以通過perticular列過濾器的方法來分離數據到月/年,這是在裝。

另一個優點從性能的角度來看,如果你經常過濾數據這樣,您可以創建基於索引在這個日期欄。

出於性能原因和信息如何存儲在SQL中,建議不要使用包含相同信息的多個表。最終它會佔用更多的空間,如果一個月的數據需要引用另一個月的數據,它將會非常緩慢。

希望這會有所幫助。

0

如果你覺得這是不是你很難管理你的應用程序,你可以做到這一點。

例子。你需要每個月更改SQL查詢嗎? 如果用戶需要更多需要數據超過1個月的報告,會發生什麼?

使用partitioning,DBMS會將您的數據拆分爲物理存儲上的多個表,但您可以用相同的名稱調用它們中的所有表。 DBMS將使用分區進行分析。性能沒有顯着差異。