Skip to content

Commit

Permalink
update zh-tw content
Browse files Browse the repository at this point in the history
  • Loading branch information
yingang committed Oct 21, 2021
1 parent 1d4b510 commit e500b0d
Show file tree
Hide file tree
Showing 7 changed files with 42 additions and 43 deletions.
2 changes: 1 addition & 1 deletion zh-tw/ch11.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@

* 資料庫通常保留資料直至顯式刪除,而大多數訊息代理在訊息成功遞送給消費者時會自動刪除訊息。這樣的訊息代理不適合長期的資料儲存。
* 由於它們很快就能刪除訊息,大多數訊息代理都認為它們的工作集相當小—— 即佇列很短。如果代理需要緩衝很多訊息,比如因為消費者速度較慢(如果記憶體裝不下訊息,可能會溢位到磁碟),每個訊息需要更長的處理時間,整體吞吐量可能會惡化【6】。
* 資料庫通常支援二級索引和各種搜尋資料的方式,而訊息代理通常支援按照某種模式匹配主題,訂閱其子集。雖然機制並不一樣,但對於客戶端選擇想要了解的資料的一部分,都是基本的方式。
* 資料庫通常支援次級索引和各種搜尋資料的方式,而訊息代理通常支援按照某種模式匹配主題,訂閱其子集。雖然機制並不一樣,但對於客戶端選擇想要了解的資料的一部分,都是基本的方式。
* 查詢資料庫時,結果通常基於某個時間點的資料快照;如果另一個客戶端隨後向資料庫寫入一些改變了查詢結果的內容,則第一個客戶端不會發現其先前結果現已過期(除非它重複查詢或輪詢變更)。相比之下,訊息代理不支援任意查詢,但是當資料發生變化時(即新訊息可用時),它們會通知客戶端。

​ 這是關於訊息代理的傳統觀點,它被封裝在諸如JMS 【14】和AMQP 【15】的標準中,並且被諸如RabbitMQ、ActiveMQ、HornetQ、Qpid、TIBCO企業訊息服務、IBM MQ、Azure Service Bus和Google Cloud Pub/Sub所實現 【16】。
Expand Down
6 changes: 3 additions & 3 deletions zh-tw/ch12.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,9 @@

​ 具有良好定義的輸入和輸出的確定性函式的原理不僅有利於容錯(請參閱“[冪等性](ch11.md#冪等性)”),也簡化了有關組織中資料流的推理【7】。無論衍生資料是搜尋索引、統計模型還是快取,採用這種觀點思考都是很有幫助的:將其視為從一個東西衍生出另一個的資料管道,透過函式式應用程式碼推送一個系統的狀態變更,並將其效果應用至衍生系統中。

​ 原則上,衍生資料系統可以同步地維護,就像關係資料庫在與索引表寫入操作相同的事務中同步更新輔助索引一樣。然而,非同步是使基於事件日誌的系統穩健的原因:它允許系統的一部分故障被抑制在本地。而如果任何一個參與者失敗,分散式事務將中止,因此它們傾向於透過將故障傳播到系統的其餘部分來放大故障(請參閱“[分散式事務的限制](ch9.md#分散式事務的限制)”)。
​ 原則上,衍生資料系統可以同步地維護,就像關係資料庫在與索引表寫入操作相同的事務中同步更新次級索引一樣。然而,非同步是使基於事件日誌的系統穩健的原因:它允許系統的一部分故障被抑制在本地。而如果任何一個參與者失敗,分散式事務將中止,因此它們傾向於透過將故障傳播到系統的其餘部分來放大故障(請參閱“[分散式事務的限制](ch9.md#分散式事務的限制)”)。

​ 我們在“[分割槽與次級索引](ch6.md#分割槽與次級索引)”中看到,二級索引經常跨越分割槽邊界。具有二級索引的分割槽系統需要將寫入傳送到多個分割槽(如果索引按關鍵詞分割槽的話)或將讀取傳送到所有分割槽(如果索引是按文件分割槽的話)。如果索引是非同步維護的,這種跨分割槽通訊也是最可靠和最可伸縮的【8】(另請參閱“[多分割槽資料處理](多分割槽資料處理)”)。
​ 我們在“[分割槽與次級索引](ch6.md#分割槽與次級索引)”中看到,次級索引經常跨越分割槽邊界。具有次級索引的分割槽系統需要將寫入傳送到多個分割槽(如果索引按關鍵詞分割槽的話)或將讀取傳送到所有分割槽(如果索引是按文件分割槽的話)。如果索引是非同步維護的,這種跨分割槽通訊也是最可靠和最可伸縮的【8】(另請參閱“[多分割槽資料處理](多分割槽資料處理)”)。

#### 應用演化後重新處理資料

Expand Down Expand Up @@ -261,7 +261,7 @@

用於次級索引的衍生函式是如此常用的需求,以致於它作為核心功能被內建至許多資料庫中,你可以簡單地透過`CREATE INDEX`來呼叫它。對於全文索引,常見語言的基本語言特徵可能內建到資料庫中,但更復雜的特徵通常需要領域特定的調整。在機器學習中,特徵工程是眾所周知的特定於應用的特徵,通常需要包含很多關於使用者互動與應用部署的詳細知識【35】。

當建立衍生資料集的函式不是像建立二級索引那樣的標準搬磚函式時,需要自定義程式碼來處理特定於應用的東西。而這個自定義程式碼是讓許多資料庫掙扎的地方,雖然關係資料庫通常支援觸發器、儲存過程和使用者定義的函式,可以用它們來在資料庫中執行應用程式碼,但它們有點像資料庫設計裡的事後反思。(請參閱“[傳遞事件流](ch11.md#傳遞事件流)”)。
當建立衍生資料集的函式不是像建立次級索引那樣的標準搬磚函式時,需要自定義程式碼來處理特定於應用的東西。而這個自定義程式碼是讓許多資料庫掙扎的地方,雖然關係資料庫通常支援觸發器、儲存過程和使用者定義的函式,可以用它們來在資料庫中執行應用程式碼,但它們有點像資料庫設計裡的事後反思。(請參閱“[傳遞事件流](ch11.md#傳遞事件流)”)。

#### 應用程式碼和狀態的分離

Expand Down
10 changes: 5 additions & 5 deletions zh-tw/ch3.md
Original file line number Diff line number Diff line change
Expand Up @@ -299,17 +299,17 @@ B樹在資料庫體系結構中是非常根深蒂固的,為許多工作負載

到目前為止,我們只討論了鍵值索引,它們就像關係模型中的**主鍵(primary key)** 索引。主鍵唯一標識關係表中的一行,或文件資料庫中的一個文件或圖形資料庫中的一個頂點。資料庫中的其他記錄可以透過其主鍵(或ID)引用該行/文件/頂點,並且索引用於解析這樣的引用。

有二級索引也很常見。在關係資料庫中,您可以使用 `CREATE INDEX` 命令在同一個表上建立多個二級索引,而且這些索引通常對於有效地執行聯接而言至關重要。例如,在[第二章](ch2.md)中的[圖2-1](../img/fig2-1.png)中,很可能在 `user_id` 列上有一個二級索引,以便您可以在每個表中找到屬於同一使用者的所有行。
有次級索引也很常見。在關係資料庫中,您可以使用 `CREATE INDEX` 命令在同一個表上建立多個次級索引,而且這些索引通常對於有效地執行聯接而言至關重要。例如,在[第二章](ch2.md)中的[圖2-1](../img/fig2-1.png)中,很可能在 `user_id` 列上有一個次級索引,以便您可以在每個表中找到屬於同一使用者的所有行。

一個二級索引可以很容易地從一個鍵值索引構建。主要的不同是鍵不是唯一的。即可能有許多行(文件,頂點)具有相同的鍵。這可以透過兩種方式來解決:或者透過使索引中的每個值,成為匹配行識別符號的列表(如全文索引中的釋出列表),或者透過向每個索引新增行識別符號來使每個關鍵字唯一。無論哪種方式,B樹和日誌結構索引都可以用作輔助索引
一個次級索引可以很容易地從一個鍵值索引構建。主要的不同是鍵不是唯一的。即可能有許多行(文件,頂點)具有相同的鍵。這可以透過兩種方式來解決:或者透過使索引中的每個值,成為匹配行識別符號的列表(如全文索引中的釋出列表),或者透過向每個索引新增行識別符號來使每個關鍵字唯一。無論哪種方式,B樹和日誌結構索引都可以用作次級索引

#### 將值儲存在索引中

索引中的鍵是查詢搜尋的內容,而其值可以是以下兩種情況之一:它可以是所討論的實際行(文件,頂點),也可以是對儲存在別處的行的引用。在後一種情況下,行被儲存的地方被稱為**堆檔案(heap file)**,並且儲存的資料沒有特定的順序(它可以是僅追加的,或者可以跟蹤被刪除的行以便用新資料覆蓋它們後來)。堆檔案方法很常見,因為它避免了在存在多個二級索引時複製資料:每個索引只引用堆檔案中的一個位置,實際的資料儲存在一個地方。
索引中的鍵是查詢搜尋的內容,而其值可以是以下兩種情況之一:它可以是所討論的實際行(文件,頂點),也可以是對儲存在別處的行的引用。在後一種情況下,行被儲存的地方被稱為**堆檔案(heap file)**,並且儲存的資料沒有特定的順序(它可以是僅追加的,或者可以跟蹤被刪除的行以便用新資料覆蓋它們後來)。堆檔案方法很常見,因為它避免了在存在多個次級索引時複製資料:每個索引只引用堆檔案中的一個位置,實際的資料儲存在一個地方。

在不更改鍵的情況下更新值時,堆檔案方法可以非常高效:只要新值的位元組數不大於舊值,就可以覆蓋該記錄。如果新值更大,情況會更復雜,因為它可能需要移到堆中有足夠空間的新位置。在這種情況下,要麼所有的索引都需要更新,以指向記錄的新堆位置,或者在舊堆位置留下一個轉發指標【5】。

在某些情況下,從索引到堆檔案的額外跳躍對讀取來說效能損失太大,因此可能希望將索引行直接儲存在索引中。這被稱為聚集索引。例如,在MySQL的InnoDB儲存引擎中,表的主鍵總是一個聚集索引,二級索引則引用主鍵(而不是堆檔案中的位置)【31】。在SQL Server中,可以為每個表指定一個聚集索引【32】。
在某些情況下,從索引到堆檔案的額外跳躍對讀取來說效能損失太大,因此可能希望將索引行直接儲存在索引中。這被稱為聚集索引。例如,在MySQL的InnoDB儲存引擎中,表的主鍵總是一個聚集索引,次級索引則引用主鍵(而不是堆檔案中的位置)【31】。在SQL Server中,可以為每個表指定一個聚集索引【32】。

**聚集索引(clustered index)** (在索引中儲存所有行資料)和 **非聚集索引(nonclustered index)** (僅在索引中儲存對資料的引用)之間的折衷被稱為 **包含列的索引(index with included columns)****覆蓋索引(covering index)**,其儲存表的一部分在索引內【33】。這允許透過單獨使用索引來回答一些查詢(這種情況叫做:索引 **覆蓋(cover)** 了查詢)【32】。

Expand Down Expand Up @@ -548,7 +548,7 @@ WHERE product_sk = 31 AND store_sk = 3

這個想法的巧妙擴充套件在C-Store中引入,並在商業資料倉庫Vertica【61,62】中被採用。不同的查詢受益於不同的排序順序,為什麼不以幾種不同的方式來儲存相同的資料呢?無論如何,資料需要複製到多臺機器,這樣,如果一臺機器發生故障,您不會丟失資料。您可能還需要儲存以不同方式排序的冗餘資料,以便在處理查詢時,可以使用最適合查詢模式的版本。

在一個面向列的儲存中有多個排序順序有點類似於在一個面向行的儲存中有多個二級索引。但最大的區別在於面向行的儲存將每一行儲存在一個地方(在堆檔案或聚簇索引中),二級索引只包含指向匹配行的指標。在列儲存中,通常在其他地方沒有任何指向資料的指標,只有包含值的列。
在一個面向列的儲存中有多個排序順序有點類似於在一個面向行的儲存中有多個次級索引。但最大的區別在於面向行的儲存將每一行儲存在一個地方(在堆檔案或聚簇索引中),次級索引只包含指向匹配行的指標。在列儲存中,通常在其他地方沒有任何指向資料的指標,只有包含值的列。

### 寫入列儲存

Expand Down
Loading

0 comments on commit e500b0d

Please sign in to comment.