2010-01-17 81 views
2
的垂直分區

注意,這種情況是不是很確切地怎麼回事,但我做了這個爲例)優勢表

我有一個表數據的實體即每5更新如果有的話(顏色,品牌,原始時間),幾乎不更新的其他數據(秒)(運動數據:速度,標題,緯度,長度和位置時間)。

alt text http://www.freeimagehosting.net/uploads/a67205e99e.jpg

現在我的老闆要我在我們的數據庫分區這個數據到單獨的表(有一個一對一的關係),像這樣:

alt text http://www.freeimagehosting.net/uploads/1c699bc3c5.jpg

他使它聽起來「顯而易見的「,它應該是這樣的,但是真的有這些數據分開插入和更新(例如,如果我把一個索引顏色或製造)的任何優勢?

+0

@Grasper:你確定FK在正確的桌子上嗎? – 2010-04-20 03:10:31

回答

5

這樣做垂直分區可能是有意義的。或者它可能不會。

當您使用基於MVCC的引擎時,每次更新一行時,它通常會*複製整行並創建一個新的修改。這是爲了使尚未看到更新的其他事務可以在需要時繼續讀取原始行。

這意味着在非常寬的行中頻繁更新一些小列會導致數據庫執行的寫操作比需要的要多得多。

但並不是那麼多,因爲通常引擎只會同步它的事務日誌,無論非更新列的大小如何,這將是相同的大小,也因爲數據行通常存儲在塊塊無論如何都需要寫入,無論它有多少變化。

所以這聽起來像一個潛在的毫無意義的優化,這就像任何其他的,應當對 一個理由被認爲是)真的有性能問題(即是 所需的任何優化)和b)是這個特定的優化解決它的最佳方法?

我認爲a)的可能性不大,並且b)也不太可能,所以這個需求的機率幾乎不太可能平方。

*某些引擎會對非常大的列進行例外處理,例如大BLOB或文本列,這些列在其他位置保存,如果行中的其他列被更新,則不會複製。

+1

我同意MarkR。問你的老闆爲什麼需要改變。如果他由於性能問題告訴你,你需要檢查是否有任何性能問題,如果沒有問題,永遠不要優化性能。如果您遇到性能問題,則需要對分區進行歸一化處理。如果他告訴你這是因爲「它必須是這樣的」,你可以與他辯論關於數據庫正常化的意義和廢話,或者只是改變他的(舊學校)設計。 (我會做最後一個。) – Beffa 2010-01-17 22:09:27

0

你的老闆是對的。這與「分區」無關,即所謂的標準化。

Read this article.

EDIT:好,「垂直分區」是公知的術語,並且歸一化是垂直分區中的一個方法。但在這種情況下,正常化似乎是正確的答案,其中解釋的問題(Quote:「...真的有這樣的數據分開插入和更新有什麼好處」)。標準化的優點和缺點是衆所周知的。維基百科文章是一個很好的起點。

爲了保持「Erwin Smout」的火焰:「垂直分解」在這裏似乎不是一個常用術語。對?

+1

問題中沒有任何內容表明原始設計中每輛車有多行。相反,它說的是每隔幾秒「更新一次」。 – 2010-01-17 21:49:35

+0

@calmh:我不明白?正如問題所示,其「顯而易見」。有解釋的餘地​​,但對我來說,它看起來很像是疑問者缺乏關於正常化概念的知識(沒有任何意圖)。 – Frunsi 2010-01-17 21:53:26

+0

我看到現在有一​​個引用「插入」的結尾,這兩者之前都沒有,或者我錯過了。刪除downvote。 – 2010-01-17 21:58:41

1

如果這個設計的目的是保持運動學數據的歷史那麼設計是有意義的。儘管CAR_KINEMATIC表中似乎沒有適合該用法的關鍵字。另一方面,如果這兩個表格之間存在一對一的關係,那麼該部門就沒有任何價值。

0

我不確定這個問題是否完全清楚。如果您想主要介紹運動學的歷史,那麼適當的結構就是將數據標準化爲汽車數據和航向數據。汽車數據可以獨立更新,並且可能比運動學數據整體小得多。

如果您想保持汽車當前狀態的平坦記錄,而不是保持歷史記錄,那麼保留原樣的數據可能會更快。原因是編寫整個記錄在大多數情況下可能只需要一次寫操作。將其拆分爲兩個表格可確保至少有兩次寫入操作。

在第一種情況下,您只是規範化數據;在第二種情況下,當前的數據結構可能是最有效的。

垂直分區實際上並不常用(除非是這樣,請參見下文)。有些情況下,您可能需要使用垂直分區爲:

  • 表是很寬的,只有一些是經常使用的。例如,如果您有一個包含250列的表,其中有5個更新頻繁的狀態更改,並且應用程序頻繁使用一小部分列。

  • 出於安全原因,您可能混合使用1:1關係的機密數據和非敏感數據。您可以將機密數據移入具有不同權限集的另一個表中。從歷史上看,並非所有DBMS平臺都允許您在列級設置權限。

  • 前兩項的組合,其中某些字段的更改必須記錄到審計表中,但其他字段會更頻繁地更新而不需要記錄。爲了避免生成大量虛假審計日誌數據,可審計字段可以使用審計日誌記錄觸發器存在於其自己的表中。

最後,你得到在某些情況下在後臺垂直分區(即,不是在架構明確,但以這種方式物理存儲的作品)。例如,許多DBMS平臺將LOB與常規表數據分開存儲,這會導致表的一種隱式垂直分區。

事實上,這種特殊的情況使得帶有LOB列的表在開展操作時相當昂貴,因此將LOB列移入單獨的表中可能是垂直分區的良好應用。

垂直分區的用途並不多,它總是會增加額外I/O的開銷。您需要避免大量開銷或者有特定的原因,例如安全問題,因此需要使用它。