空間換時間

2021-10-22 05:38:08 字數 1804 閱讀 5315

空間換時間這樣的思路,在程式設計演算法、硬體設計燈、戰爭領域都是有涉及的,我這裡所講的空間換時間是被包含在資料倉儲範疇裡面的。空間換時間,我的理解是什麼呢?就是我們需要設計一種資料結構,這種資料結構最大的特點是提高查詢的效率。我在這裡總結一下,空間換時間的做法。

在業務系統裡面,一般會按照資料庫的三正規化來設計表的結構。來,我們先看看三正規化是什麼?

符合這三正規化的表會具有高內聚,低耦合的特定,也就是往往相關的內容會分割到乙個表裡面。

如下圖所示乙個商品模組的資料庫設計。

我們看到商品各個維度的屬性都放到不同的表裡面,這樣的做會減少冗餘資料的產生,大大的節約儲存空間。但是利於我們快速的查詢商品的屬性,在數倉裡面,我們會將商品相關屬性關聯起來放到一表裡面。例如,在電商的場景下,我們經常會做乙個商品的分類表。我們的做法是將類目、屬性名、產品基本屬性值表、屬性值這幾張表 join 到一起,形成乙個表。

這種做法就是一種非常常見的空間換時間的做法,我們知道如果我們想知道商品的某種屬性的名稱和值,那我們需要將類目、屬性名、產品幾步屬性值表、屬性值這幾張表 join 起來,join 是需要時間來計算的,這不好,我們可以預先將這幾個表 join 到一起形成乙個表,這樣的話,我們在每次查詢的過程中,是不是就不用 join 這種操作了,只是會增加一些冗餘的資料。不過這就是空間換時間的代價。

說了這麼多,資料拉寬到底是個什麼東西呢?你看我們上面我們把幾個表放到乙個表裡面,是不是好像把表拉寬以後,把資料放到乙個表裡面了,目標表我們通常叫做寬表。這就是所謂的拉寬操作。

上面提到的 join 方式是拉寬的一種形式。還有另外一種形式。

我們以折現圖為例子,加入我們需要設計乙個表來儲存折現圖裡面的資料,應該如何設計呢?

我們可以設計成如下的結構:

欄位名字

字段解釋

x軸座標

y軸座標

這樣會產生 8 條記錄。對我們查詢系統來說。還有更快的設計。

欄位名字

字段解釋

1 對應 x 軸的座標

1 對應 y 軸座標

2 對應 x 軸的座標

2 對應 y 軸座標

3 對應 x 軸的座標

3 對應 y 軸座標

4 對應 x 軸的座標

4 對應 y 軸座標

5 對應 x 軸的座標

5 對應 y 軸座標

6 對應 x 軸的座標

6 對應 y 軸座標

7 對應 x 軸的座標

7 對應 y 軸座標

8 對應 x 軸的座標

8 對應 y 軸座標

這樣設計呢?我們是不是一條記錄就可以差到所有需要的資料,看起來是不是也是把資料拉寬了。

有的時候增強資料的對標效果,我們也會將資料拉寬處理。例如下面的 gdp。為更直觀對比每個季度 gdp 的數值,我們通常會將各個季度資料拉寬。

欄位名稱

字段說明

司機名稱

打點時間

司機名稱

打點資料

張三111100001010101010101010100101010101 …

預計算就是將可能用到的指標先計算出來放到**,等用到的時候,之間拿出來用的做法。例如,還是以電商為例子,肯定會計算每個城市下面的銷售額。那我們會想到會不會用到每個省下面的銷售額?不管有沒有,我們先計算出來再說。雖然存在暫時沒有用的情況,但是其實再寫 sql 或者其他實現方式的時候,工作量是差不多的,占用的空間也是有限的。

空間換時間隨筆

空間換時間隨筆 在實際的生活中,難免遇到排隊的事情,比如去銀行存錢取錢,轉賬等,如果去櫃檯都有先拿個號,按號排隊處理業務,這是非常常見的,火爆的餐館也是這樣。為提高效率,減少等待時間,銀行的做法可以是簡化辦事流程,提供營業員的處理速度來減少使用者等待的時間,另乙個做法可以是增加櫃檯,多些營業員來處理...

JAVA空間換時間以及時間換空間的例子

演算法的好壞有兩個指標 需要的記憶體空間 可以 理解為執行 需要的記憶體空間 執行的時間 可以簡單的理解為 需要執行的步數 程式的設計要不就是時間換空間,要不就是用空間去換時間。並且時間和空間是可以進行相互轉化的 對於執行的慢的程式,可以通過消耗記憶體 即構造新的資料結構 來進行優化。而消耗記憶體的...

以空間換時間經典演算法

以前看過一篇文章 優化c 常用的幾招 作者提到的第一招就是 以空間換時間 還舉了乙個例子,由於比較經典,引用一下 電腦程式中最大的矛盾是空間和時間的矛盾,那麼,從這個角度出發逆向思維來考慮程式的效率問題,我們就有了解決問題的第1招 以空間換時間。比如說字串的賦值 方法a 通常的辦法 define l...