> For the complete documentation index, see [llms.txt](https://vonng.gitbook.io/vonng/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://vonng.gitbook.io/vonng/content/tw/part-iii.md).

# 第三部分：衍生資料

在本書的 [第一部分](https://github.com/Vonng/ddia/blob/master/tw/part-i/README.md) 和 [第二部分](https://github.com/Vonng/ddia/blob/master/tw/part-ii/README.md) 中，我們自底向上地把所有關於分散式資料庫的主要考量都過了一遍。從資料在磁碟上的佈局，一直到出現故障時分散式系統一致性的侷限。但所有的討論都假定了應用中只用了一種資料庫。

現實世界中的資料系統往往更為複雜。大型應用程式經常需要以多種方式訪問和處理資料，沒有一個數據庫可以同時滿足所有這些不同的需求。因此應用程式通常組合使用多種元件：資料儲存、索引、快取、分析系統等等，並實現在這些元件中移動資料的機制。

本書的最後一部分，會研究將多個不同資料系統（可能有著不同資料模型，並針對不同的訪問模式進行最佳化）整合為一個協調一致的應用架構時，會遇到的問題。軟體供應商經常會忽略這一方面的生態建設，並聲稱他們的產品能夠滿足你的所有需求。在現實世界中，整合不同的系統是實際應用中最重要的事情之一。

### 記錄系統和衍生資料系統

從高層次上看，儲存和處理資料的系統可以分為兩大類：

* 記錄系統（System of record）

  **記錄系統**，也被稱為 **真相源（source of truth）**，持有資料的權威版本。當新的資料進入時（例如，使用者輸入）首先會記錄在這裡。每個事實正正好好表示一次（表示通常是 **正規化的**，即 normalized）。如果其他系統和 **記錄系統** 之間存在任何差異，那麼記錄系統中的值是正確的（根據定義）。
* 衍生資料系統（Derived data systems）

  **衍生系統** 中的資料，通常是另一個系統中的現有資料以某種方式進行轉換或處理的結果。如果丟失衍生資料，可以從原始來源重新建立。典型的例子是 **快取（cache）**：如果資料在快取中，就可以由快取提供服務；如果快取不包含所需資料，則降級由底層資料庫提供。非規範化的值，索引和物化檢視亦屬此類。在推薦系統中，預測彙總資料通常衍生自使用者日誌。

從技術上講，衍生資料是 **冗餘的（redundant）**，因為它重複了已有的資訊。但是衍生資料對於獲得良好的只讀查詢效能通常是至關重要的。它通常是非規範化的。可以從單個源頭衍生出多個不同的資料集，使你能從不同的 “視角” 洞察資料。

並不是所有的系統都在其架構中明確區分 **記錄系統** 和 **衍生資料系統**，但是這是一種有用的區分方式，因為它明確了系統中的資料流：系統的哪一部分具有哪些輸入和哪些輸出，以及它們如何相互依賴。

大多數資料庫，儲存引擎和查詢語言，本質上既不是記錄系統也不是衍生系統。資料庫只是一個工具：如何使用它取決於你自己。**記錄系統和衍生資料系統之間的區別不在於工具，而在於應用程式中的使用方式。**

透過梳理資料的衍生關係，可以清楚地理解一個令人困惑的系統架構。這將貫穿本書的這一部分。

### 章節概述

我們將從 [第十章](https://github.com/Vonng/ddia/blob/master/tw/ch10/README.md) 開始，研究例如 MapReduce 這樣 **面向批處理（batch-oriented）** 的資料流系統。對於建設大規模資料系統，我們將看到，它們提供了優秀的工具和思想。[第十一章](https://github.com/Vonng/ddia/blob/master/tw/ch11/README.md) 將把這些思想應用到 **流式資料（data streams）** 中，使我們能用更低的延遲完成同樣的任務。[第十二章](https://github.com/Vonng/ddia/blob/master/tw/ch12/README.md) 將對本書進行總結，探討如何使用這些工具來構建可靠，可伸縮和可維護的應用。

### 索引

* [第十章：批處理](https://github.com/Vonng/ddia/blob/master/tw/ch10/README.md)
  * [使用Unix工具的批處理](https://github.com/Vonng/ddia/blob/master/tw/ch10/README.md#使用Unix工具的批處理)
  * [MapReduce和分散式檔案系統](https://github.com/Vonng/ddia/blob/master/tw/ch10/README.md#MapReduce和分散式檔案系統)
  * [MapReduce之後](https://github.com/Vonng/ddia/blob/master/tw/ch10/README.md#MapReduce之後)
  * [本章小結](https://github.com/Vonng/ddia/blob/master/tw/ch10/README.md#本章小結)
* [第十一章：流處理](https://github.com/Vonng/ddia/blob/master/tw/ch11/README.md)
  * [傳遞事件流](https://github.com/Vonng/ddia/blob/master/tw/ch11/README.md#傳遞事件流)
  * [資料庫與流](https://github.com/Vonng/ddia/blob/master/tw/ch11/README.md#資料庫與流)
  * [流處理](https://github.com/Vonng/ddia/blob/master/tw/ch11/README.md#流處理)
  * [本章小結](https://github.com/Vonng/ddia/blob/master/tw/ch11/README.md#本章小結)
* [第十二章：資料系統的未來](https://github.com/Vonng/ddia/blob/master/tw/ch12/README.md)
  * [資料整合](https://github.com/Vonng/ddia/blob/master/tw/ch12/README.md#資料整合)
  * [分拆資料庫](https://github.com/Vonng/ddia/blob/master/tw/ch12/README.md#分拆資料庫)
  * [將事情做正確](https://github.com/Vonng/ddia/blob/master/tw/ch12/README.md#將事情做正確)
  * [做正確的事情](https://github.com/Vonng/ddia/blob/master/tw/ch12/README.md#做正確的事情)
  * [本章小結](https://github.com/Vonng/ddia/blob/master/tw/ch12/README.md#本章小結)
