2011-08-19 63 views
2

應用程序動態創建數據庫表作爲分區的手段是否合理?動態創建表作爲分區的一種方式:好還是壞做法?

例如,假設我有一個大表「widgets」,其中有一個標識每行所有者的「userID」列。如果這個表格變得非常大,那麼讓應用程序爲每個新用戶創建一個名爲「widgets_ {username}」的新表格會有意義嗎?假設應用程序一次只需查詢屬於單個用戶的小部件(即不需要嘗試將這些用戶小部件表中的任何一個連接在一起)。

這樣做會將一張大桌子拆分爲更容易管理的塊,但這看起來不是一個優雅的解決方案。在我看來,應該在應用程序寫入時定義數據庫模式,並且任何運行時數據都以行的形式存儲,而不是作爲附加的表存儲。

作爲一個更普遍的問題,在運行時修改數據庫模式可以嗎?

編輯:這個問題大多是假設的;我有一個非常好的感覺,即在運行時創建表沒有任何意義。這就是說,我們的應用程序中有一個包含數百萬行的表格。 SELECTs表現良好,但刪除特定用戶擁有的所有行可能需要一段時間。基本上我正在尋找一些可靠的推理,爲什麼只是爲每個用戶動態創建一個表格對於我什麼時候被問到什麼都沒有意義。

+1

爲什麼你認爲一個擁有大量小部件 - 用戶名錶的數據庫比一個帶有額外列「用戶名」的表更好?使用後者,並使用正確的索引。 – Konerak

+0

爲什麼還要打擾?是SELECT * FROM部件WHERE userID ='Fulano'需要很長時間才能運行? –

+0

「輕鬆管理」是什麼意思?你在談論查詢表格還是存檔等任務? –

回答

6

NO,NO,NO !!現在重複我之後,I will not do this because it will create many headaches and problems in the future!數據庫被用來處理大量的信息。他們使用索引來快速找到你在做什麼。認爲phone book這個指數有多有效?對每個姓都有不同的書會更好嗎?

這不會給你任何明智的表現。保留單個表格,但一定要在用戶標識上索引,並且您將能夠快速獲取數據。然而,如果將表格拆分,那麼獲得跨越多個用戶的任何信息變得不可能/非常困難,例如搜索某個特定窗口小部件的所有用戶,特定類型的所有窗口小部件的計數等等。您需要每個查詢動態構建。

如果刪除行很慢,請查看該行。我們一次談論10,1000,100000多少行?這張桌子上的聚簇索引是什麼?你可以使用「軟刪除」,你有一個狀態列,你更新爲「D」標記行被刪除。你可以在以後刪除行,數據庫活動較少。是刪除緩慢,因爲它被其他活動阻止。在分解表格之前查看這些內容。

1

動態地創建數據庫表 作爲分區的手段是否合理?

號(笑)

+2

所以你從他的整個文本中拿出一個問題,並回答一個單詞的答案?這對他來說很難學習... – Konerak

+0

他的整個文本*是*這個問題,這是一個錯誤的問題。 「動態創建表格」不是問題,它是一個解決方案。顯然,OP的問題是DELETE性能很差,可能是在多租戶數據庫中。 –

3

不,這將是一個壞主意。然而,一些DBMS(例如Oracle)允許單個表在列的值上進行分區,這將實現目標,而不會在運行時創建新表。話雖如此,分區表不是「規範」:它通常只在非常大的數據庫中完成。

2

使用userID上的索引應該可以獲得接近相同的性能。

在我看來,在運行時更改數據庫模式是不好的做法。 考慮,例如,安全問題...

相關問題