跳至主要內容

目錄

DDIA 第二版完整目錄:十四章,涵蓋資料系統基礎、分散式資料與派生資料。

這份目錄與左側章節樹、頁末順序導航共享同一閱讀順序;章內標題直接來自各頁的穩定錨點。選擇任意條目即可進入對應章節或小節。

插圖目錄

全書編號插圖使用穩定圖號和錨點;正文中的“圖 N-N”引用會同時連結到這裡列出的目標。

  1. 圖 1-1 — 將資料透過 ETL 匯入資料倉儲的簡化示意圖。
  2. 圖 1-2 — 軟體型別及其運維方式的連續譜。
  3. 圖 2-1 — 一個允許使用者相互關注的社交網路的簡單關係模式。
  4. 圖 2-2 — 扇出——把新帖子投遞給發帖使用者的每一位關注者。
  5. 圖 2-3 — 當服務的吞吐量接近其處理能力上限時,排隊會使響應時間急劇增加。
  6. 圖 2-4 — 響應時間、服務時間、網路延遲和排隊延遲。
  7. 圖 2-5 — 用 100 次服務請求的響應時間樣本說明平均值和分位數。
  8. 圖 2-6 — 當一次請求需要多個後端呼叫時,只需一個慢呼叫,就會拖慢整個終端使用者請求。
  9. 圖 3-1 — 使用關係模式表示 LinkedIn 個人資料。
  10. 圖 3-2 — 一對多關係形成樹狀結構。
  11. 圖 3-3 — 關係模型中的多對多關係。
  12. 圖 3-4 — 文件模型中的多對多關係;每個虛線框內的資料可以組成一份文件。
  13. 圖 3-5 — 用於資料倉儲的星型模式示例。
  14. 圖 3-6 — 圖結構資料示例(框表示頂點,箭頭表示邊)。
  15. 圖 3-7 — 使用示例 3-12 中的 Datalog 規則確定愛達荷州在北美。
  16. 圖 3-8 — 以不可變事件日誌作為權威資料來源,並從中派生物化檢視。
  17. 圖 3-9 — 將電影評分的關聯式資料庫轉換為矩陣表示。
  18. 圖 4-1 — 以類似 CSV 的格式儲存鍵值對日誌,並使用記憶體雜湊對映建立索引。
  19. 圖 4-2 — 帶有稀疏索引的 SSTable,查詢可以直接跳到正確的資料塊。
  20. 圖 4-3 — 合併多個 SSTable 段,僅保留每個鍵的最新值。
  21. 圖 4-4 — 布隆過濾器以機率方式快速判斷某個鍵是否存在於某個 SSTable 中。
  22. 圖 4-5 — 使用 B 樹索引查詢鍵 251。先從根頁沿引用進入鍵 200–300 所在的頁,再進入鍵 250–270 所在的頁。
  23. 圖 4-6 — 在邊界鍵 337 處拆分頁,使 B 樹增長;父頁也隨之更新,以引用兩個子頁。
  24. 圖 4-7 — 按列而不是按行儲存關係資料。
  25. 圖 4-8 — 對單列進行壓縮並建立點陣圖索引的儲存方式。
  26. 圖 4-9 — 兩張點陣圖的按位與運算非常適合向量化處理。
  27. 圖 4-10 — 多維資料集的兩個維度,透過求和聚合資料。
  28. 圖 4-11 — 在 HNSW 索引中查詢最接近給定查詢向量的資料庫條目。
  29. 圖 5-1 — 舊版應用程式更新先前由新版應用程式寫入的資料時,若處理不慎,可能丟失資料。
  30. 圖 5-2 — 示例 5-2 中的記錄使用 MessagePack 編碼後的結果。
  31. 圖 5-3 — 使用 Protocol Buffers 編碼的示例記錄。
  32. 圖 5-4 — 使用 Avro 編碼的示例記錄。
  33. 圖 5-5 — Protocol Buffers 的編碼與解碼可以使用不同版本的模式。Avro 解碼時使用兩個模式:寫入者模式必須與編碼時所用模式完全相同,讀取者模式則可以是較舊或較新的版本。
  34. 圖 5-6 — Avro 讀取器協調寫入者模式與讀取者模式之間的差異。
  35. 圖 5-7 — 使用圖形化的業務流程模型與標記法(BPMN)表示工作流的示例。
  36. 圖 II-1 — 一個資料庫切分為兩個分割槽,每個分割槽都有兩個副本
  37. 圖 6-1 — 單主複製把所有寫入都發往指定的領導者,再由領導者將變更流傳送給各追隨者副本。
  38. 圖 6-2 — 基於領導者的複製,其中一個追隨者同步複製,另一個非同步複製。
  39. 圖 6-3 — 使用者寫入後,又從陳舊副本讀取。要防止這種異常,需要寫後讀一致性。
  40. 圖 6-4 — 使用者先從較新的副本讀取,隨後從陳舊副本讀取,時間彷彿倒退了。要防止這種異常,需要單調讀。
  41. 圖 6-5 — 如果某些分片的複製速度慢於其他分片,觀察者可能先看到答案,後看到問題。
  42. 圖 6-6 — 跨多個地區的多主複製。
  43. 圖 6-7 — 多主複製可以採用的三種拓撲示例。
  44. 圖 6-8 — 在多主複製中,寫入抵達某些副本的順序可能有誤。
  45. 圖 6-9 — 兩個領導者併發更新同一條記錄,造成寫入衝突。
  46. 圖 6-10 — 亞馬遜購物車異常示例:以並集方式合併購物車衝突時,已刪除的商品可能重新出現。
  47. 圖 6-11 — OT 與 CRDT 分別如何合併字串中的兩次併發插入。
  48. 圖 6-12 — 節點停機後的仲裁寫、仲裁讀和讀修復。
  49. 圖 6-13 — 如果 w + r > n,讀取的 r 個副本中至少有一個必然見過最近一次成功寫入。
  50. 圖 6-14 — Dynamo 風格資料儲存中的併發寫入沒有明確定義的順序。
  51. 圖 6-15 — 捕獲兩個客戶端併發編輯購物車時的因果依賴。
  52. 圖 6-16 — 圖 6-15 中因果依賴關係的圖示。
  53. 圖 7-1 — 複製與分片結合使用:每個節點對某些分片充當領導者,對另一些分片充當追隨者。
  54. 圖 7-2 — 印刷版百科全書按鍵範圍分片。
  55. 圖 7-3 — 透過對鍵進行雜湊並取模節點數來將鍵分配給節點。更改節點數會導致許多鍵從一個節點移動到另一個節點。
  56. 圖 7-4 — 向每個節點有多個分片的資料庫叢集新增新節點。
  57. 圖 7-5 — 為每個分片分配連續的雜湊值範圍。
  58. 圖 7-6 — Cassandra 和 ScyllaDB 將可能的雜湊值範圍(這裡是 0–1023)拆成邊界隨機的連續區間,併為每個節點分配多個區間。
  59. 圖 7-7 — 將請求路由到正確節點的三種不同方式。
  60. 圖 7-8 — 使用 ZooKeeper 跟蹤分片到節點的分配。
  61. 圖 7-9 — 本地二級索引:每個分片只索引其自己分片內的記錄。
  62. 圖 7-10 — 全域性二級索引反映來自所有分片的資料,並且本身按索引值進行分片。
  63. 圖 8-1 — 兩個客戶端併發遞增計數器之間的競態條件。
  64. 圖 8-2 — 違反隔離性:一個事務讀取另一個事務的未提交寫入(“髒讀”)。
  65. 圖 8-3 — 原子性確保如果發生錯誤,該事務的任何先前寫入都會被撤消,以避免不一致的狀態。
  66. 圖 8-4 — 沒有髒讀:使用者 2 只有在使用者 1 的事務提交後才能看到 x 的新值。
  67. 圖 8-5 — 發生髒寫時,不同事務的衝突寫入可能混雜在一起。
  68. 圖 8-6 — 讀偏差:Aaliyah 觀察到了資料庫的不一致狀態。
  69. 圖 8-7 — 使用多版本併發控制實現快照隔離。
  70. 圖 8-8 — 寫偏差導致應用程式錯誤的示例。
  71. 圖 8-9 — 互動式事務與儲存過程的差異(採用圖 8-8中的示例事務)。
  72. 圖 8-10 — 檢測事務何時從 MVCC 快照讀取過時值。
  73. 圖 8-11 — 在可序列化快照隔離中,檢測一個事務何時修改了另一個事務讀過的資料。
  74. 圖 8-12 — 當事務涉及多個資料庫節點時,它可能在某些節點上提交,在其他節點上失敗。
  75. 圖 8-13 — 兩階段提交(2PC)的成功執行。
  76. 圖 8-14 — 參與者投票“是”之後,協調者崩潰。資料庫 1 不知道該提交還是中止。
  77. 圖 9-1 — 發出請求卻沒有收到響應時,無法分辨究竟是 (a) 請求丟失、(b) 遠端節點宕機,還是 (c) 響應丟失。
  78. 圖 9-2 — 多臺機器向同一個目的地傳送網路流量時,交換機佇列可能被塞滿。圖中埠 1、2 和 4 都在嘗試向埠 3 傳送資料包。
  79. 圖 9-3 — 客戶端 B 的寫入在因果關係上晚於客戶端 A 的寫入,但 B 的寫入具有更早的時間戳。
  80. 圖 9-4 — 分散式鎖的錯誤實現:租約已經過期,客戶端 1 卻認為它依然有效,因而損壞了儲存中的檔案。
  81. 圖 9-5 — 原租約持有者發出的訊息可能延遲很久,直到另一個節點接管租約後才抵達。
  82. 圖 9-6 — 只允許寫入按照遞增的柵欄令牌順序執行,從而保證儲存訪問安全。
  83. 圖 9-7 — 使用柵欄令牌保護對無主複製資料庫的寫入。
  84. 圖 10-1 — 如果這個資料庫滿足線性一致性,那麼 Alice 的讀取應返回 1 而不是 0,或者 Bob 的讀取應返回 0 而不是 1。
  85. 圖 10-2 — 如果讀請求與寫請求併發,則可能返回舊值,也可能返回新值。
  86. 圖 10-3 — 如果 Alice 和 Bob 擁有完美時鐘,線性一致性要求讀取返回 x = 1,因為對 x 的讀取開始於 x = 1 寫入完成之後。
  87. 圖 10-4 — 對 x 的讀取與 x = 1 的寫入併發。由於不知道操作的確切時序,讀取可以返回 0 或 1。
  88. 圖 10-5 — 一個不滿足線性一致性的系統:Alice 和 Bob 在不同時刻看到上傳的影象,因此 Bob 的請求建立在陳舊資料之上。
  89. 圖 10-6 — 當網路延遲變化不定時,僅靠法定人數不足以保證線性一致性。
  90. 圖 10-7 — 如果網路分割槽使客戶端無法聯絡足夠多的副本,它們就無法處理寫入。
  91. 圖 10-8 — 兩個不同節點可能生成相互衝突的 ID。
  92. 圖 10-9 — Lamport 時間戳給出了與因果關係一致的全序。
  93. 圖 10-10 — 一個使用 Lamport 時間戳的許可權系統。
  94. 圖 11-1 — 一個包含三個 mapper 和三個 reducer 的 MapReduce 作業。
  95. 圖 11-2 — 使用者活動日誌與使用者畫像資料庫的連線。
  96. 圖 11-3 — 基於使用者 ID 的排序合併連線。若輸入資料集由多個檔案分片組成,可並行啟動多個 mapper 處理。
  97. 圖 12-1 — (a)負載均衡:由多個消費者分擔一個主題的消費工作;(b)扇出:將每條訊息傳遞給多個消費者。
  98. 圖 12-2 — 消費者 2 在處理 m3 時崩潰,因此 m3 稍後被重新傳遞給消費者 1。
  99. 圖 12-3 — 生產者把訊息追加到主題分割槽檔案中,消費者則順序讀取這些檔案。
  100. 圖 12-4 — 資料庫中的 X 先被設為 A,再被設為 B;寫入到達搜尋索引的順序卻恰好相反。
  101. 圖 12-5 — 按資料寫入一個資料庫的順序取得資料,再按相同順序將變化應用到其他系統。
  102. 圖 12-6 — 一個鍵值對日誌:鍵是貓咪影片的 ID(mew、purr、scratch 或 yawn),值是播放次數。日誌壓實只保留每個鍵的最新值。
  103. 圖 12-7 — 應用當前狀態與事件流之間的關係。
  104. 圖 12-8 — 按處理時間劃分視窗,會因處理速率的變化而產生人為假象。
  105. 圖 13-1 — 在搜尋索引中,寫入(文件更新)與讀取(查詢)相遇。
  106. 圖 13-2 — 使用事件日誌和流處理器,檢查源賬戶是否有足夠餘額,並把資金原子地轉入目標賬戶和手續費賬戶。

表格目錄

  1. 表 1-1 — 事務型系統與分析型系統的特徵比較
  2. 表 1-2 — 自託管資料庫系統與雲原生資料庫系統示例
  3. 表 8-1 — 各種隔離級別下可能發生的異常彙總。

示例目錄

  1. 範例 3-1 — 將 LinkedIn 個人資料表示為 JSON 文件
  2. 範例 3-2 — 透過 ID 引用組織的簡歷
  3. 範例 3-3 — 使用關係模式表示屬性圖
  4. 範例 3-4 — 圖 3-6 中的一部分資料,以 Cypher 查詢表示
  5. 範例 3-5 — 查詢從美國移居歐洲者的 Cypher 查詢
  6. 範例 3-6 — 使用遞迴公用表表示式,以 SQL 寫出與示例 3-5 相同的查詢
  7. 範例 3-7 — 圖 3-6 中的一部分資料,以 Turtle 三元組表示
  8. 範例 3-8 — 示例 3-7 中資料的簡潔寫法
  9. 範例 3-9 — 使用 RDF/XML 語法表示示例 3-8 中的資料
  10. 範例 3-10 — 與示例 3-5 相同的查詢,用 SPARQL 表示
  11. 範例 3-11 — 圖 3-6 中資料的子集,表示為 Datalog 事實
  12. 範例 3-12 — 與示例 3-5 相同的查詢,用 Datalog 表示
  13. 範例 3-13 — 群聊應用的 GraphQL 查詢示例
  14. 範例 3-14 — 對示例 3-13 中查詢的一種可能響應
  15. 範例 4-1 — 分析人們在一週中的哪一天更傾向於購買新鮮水果或糖果
  16. 範例 5-1 — 以整數為鍵、字串為值的 JSON 模式示例。由於 JSON 模式要求所有鍵均為字串,整數鍵表示為只包含數字的字串。
  17. 範例 5-2 — 本章將使用多種二進位制格式編碼的示例記錄
  18. 範例 5-3 — 使用 YAML 編寫的 OpenAPI 服務定義示例
  19. 範例 5-4 — 使用 FastAPI 實現示例 5-3 中定義的服務
  20. 範例 5-5 — 用於圖 5-7 所示支付工作流的 Temporal 工作流定義片段
  21. 範例 8-1 — 顯式鎖定行以防止丟失更新
  22. 範例 8-2 — 會議室預訂系統試圖避免重複預訂(在快照隔離下並不安全)