<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Process-Writing on Tarragon</title><link>https://tarrragon.github.io/blog/tags/process-writing/</link><description>Recent content in Process-Writing on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Tue, 19 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/process-writing/index.xml" rel="self" type="application/rss+xml"/><item><title>Process content 結構由最大差異維度決定、不是 universal phased</title><link>https://tarrragon.github.io/blog/report/content-structure-by-max-diff-dimension/</link><pubDate>Tue, 19 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/report/content-structure-by-max-diff-dimension/</guid><description>&lt;h2 id="結論">結論&lt;/h2>
&lt;p>跨 X process content（migration / upgrade / rollout / 演練 / playbook）的結構不是 universal、由 source 跟 target 之間的 &lt;em>差異維度組合&lt;/em> 決定。固定套「6-phase playbook」「6-section deep article」會在 &lt;em>結構錯位&lt;/em> 的場景失效。&lt;/p>
&lt;p>實證：6 種 migration / process type 產出 6 種不同結構：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Migration / process type&lt;/th>
 &lt;th>主導差異維度&lt;/th>
 &lt;th>結構&lt;/th>
 &lt;th>結構元素數&lt;/th>
 &lt;th>週期&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>高 schema 差&lt;/td>
 &lt;td>Schema / API&lt;/td>
 &lt;td>6-phase rule translation&lt;/td>
 &lt;td>11-12&lt;/td>
 &lt;td>4-9 個月&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Drop-in compatible&lt;/td>
 &lt;td>無顯著差異&lt;/td>
 &lt;td>6-section + audit prefix&lt;/td>
 &lt;td>7-8&lt;/td>
 &lt;td>1-4 週&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Operational redesign&lt;/td>
 &lt;td>Operational model&lt;/td>
 &lt;td>Hybrid (4-phase 含 audit + drop-in cutover)&lt;/td>
 &lt;td>11-12&lt;/td>
 &lt;td>6-12 週&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Multi-tool 拆分&lt;/td>
 &lt;td>一站式 → 多 component&lt;/td>
 &lt;td>Parallel migration streams&lt;/td>
 &lt;td>10-11&lt;/td>
 &lt;td>2-4 個月&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Paradigm shift&lt;/td>
 &lt;td>Abstraction model&lt;/td>
 &lt;td>Partial + 混合架構&lt;/td>
 &lt;td>10-11&lt;/td>
 &lt;td>不收斂&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Topology re-layout&lt;/td>
 &lt;td>Data topology&lt;/td>
 &lt;td>機制 + execution flow（同 cluster 內重劃）&lt;/td>
 &lt;td>7-9&lt;/td>
 &lt;td>1 天-2 週&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>6 種結構是 &lt;em>常見 type&lt;/em>、不是窮盡分類；source / target 配對可能同時屬多 type（多軸 High）、或不屬任一 type（6 維皆 Medium）— 處理規則見「多重歸類跟 tie-breaking」段。本卡前身是「最大差異維度決定結構」+ 5 維 audit、Redis re-sharding dogfood 揭露 &lt;em>data topology&lt;/em> 是漏掉的第 6 維、Type F 是對應的第 6 type；本卡擴張為 6 維 audit + 6 type。&lt;/p>
&lt;hr>
&lt;h2 id="為什麼-universal-phased-模板會失效">為什麼 universal phased 模板會失效&lt;/h2>
&lt;p>寫第一篇 migration playbook 時自然會想：「6 phase 是 migration 的標準結構吧」 — 套到 drop-in compatible migration 後發現 80% phase 不需要、文章變成「為了 phase 而 phase」；套到 paradigm shift 後發現 phased 假設 &lt;em>線性收斂&lt;/em>、實際是 &lt;em>永遠混合架構&lt;/em>、phased 模板強迫一個 &lt;em>不存在&lt;/em> 的「cleanup phase」。&lt;/p>
&lt;p>Universal phased 失效的三個機制：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Schema 差不顯著時、phased 多數 phase 變空白&lt;/strong>：drop-in compatible（如 Redis → DragonflyDB）的「Schema translation phase」內容空、強寫變廢話&lt;/li>
&lt;li>&lt;strong>Operational 差是主軸時、phased 把 operational redesign 壓進「phase 1」變太薄&lt;/strong>：PostgreSQL → Aurora 的 &lt;em>operational model 重設計&lt;/em> 是核心、不該壓在一個 phase&lt;/li>
&lt;li>&lt;strong>Paradigm 差時、phased 假設 source 完全消失&lt;/strong>：Kafka ↔ NATS 是 &lt;em>永遠共存&lt;/em>、phased cleanup phase 假設不存在&lt;/li>
&lt;/ol>
&lt;p>→ &lt;strong>結構必須跟差異維度對位、不能反向假設&lt;/strong>。&lt;/p></description><content:encoded><![CDATA[<h2 id="結論">結論</h2>
<p>跨 X process content（migration / upgrade / rollout / 演練 / playbook）的結構不是 universal、由 source 跟 target 之間的 <em>差異維度組合</em> 決定。固定套「6-phase playbook」「6-section deep article」會在 <em>結構錯位</em> 的場景失效。</p>
<p>實證：6 種 migration / process type 產出 6 種不同結構：</p>
<table>
  <thead>
      <tr>
          <th>Migration / process type</th>
          <th>主導差異維度</th>
          <th>結構</th>
          <th>結構元素數</th>
          <th>週期</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>高 schema 差</td>
          <td>Schema / API</td>
          <td>6-phase rule translation</td>
          <td>11-12</td>
          <td>4-9 個月</td>
      </tr>
      <tr>
          <td>Drop-in compatible</td>
          <td>無顯著差異</td>
          <td>6-section + audit prefix</td>
          <td>7-8</td>
          <td>1-4 週</td>
      </tr>
      <tr>
          <td>Operational redesign</td>
          <td>Operational model</td>
          <td>Hybrid (4-phase 含 audit + drop-in cutover)</td>
          <td>11-12</td>
          <td>6-12 週</td>
      </tr>
      <tr>
          <td>Multi-tool 拆分</td>
          <td>一站式 → 多 component</td>
          <td>Parallel migration streams</td>
          <td>10-11</td>
          <td>2-4 個月</td>
      </tr>
      <tr>
          <td>Paradigm shift</td>
          <td>Abstraction model</td>
          <td>Partial + 混合架構</td>
          <td>10-11</td>
          <td>不收斂</td>
      </tr>
      <tr>
          <td>Topology re-layout</td>
          <td>Data topology</td>
          <td>機制 + execution flow（同 cluster 內重劃）</td>
          <td>7-9</td>
          <td>1 天-2 週</td>
      </tr>
  </tbody>
</table>
<p>6 種結構是 <em>常見 type</em>、不是窮盡分類；source / target 配對可能同時屬多 type（多軸 High）、或不屬任一 type（6 維皆 Medium）— 處理規則見「多重歸類跟 tie-breaking」段。本卡前身是「最大差異維度決定結構」+ 5 維 audit、Redis re-sharding dogfood 揭露 <em>data topology</em> 是漏掉的第 6 維、Type F 是對應的第 6 type；本卡擴張為 6 維 audit + 6 type。</p>
<hr>
<h2 id="為什麼-universal-phased-模板會失效">為什麼 universal phased 模板會失效</h2>
<p>寫第一篇 migration playbook 時自然會想：「6 phase 是 migration 的標準結構吧」 — 套到 drop-in compatible migration 後發現 80% phase 不需要、文章變成「為了 phase 而 phase」；套到 paradigm shift 後發現 phased 假設 <em>線性收斂</em>、實際是 <em>永遠混合架構</em>、phased 模板強迫一個 <em>不存在</em> 的「cleanup phase」。</p>
<p>Universal phased 失效的三個機制：</p>
<ol>
<li><strong>Schema 差不顯著時、phased 多數 phase 變空白</strong>：drop-in compatible（如 Redis → DragonflyDB）的「Schema translation phase」內容空、強寫變廢話</li>
<li><strong>Operational 差是主軸時、phased 把 operational redesign 壓進「phase 1」變太薄</strong>：PostgreSQL → Aurora 的 <em>operational model 重設計</em> 是核心、不該壓在一個 phase</li>
<li><strong>Paradigm 差時、phased 假設 source 完全消失</strong>：Kafka ↔ NATS 是 <em>永遠共存</em>、phased cleanup phase 假設不存在</li>
</ol>
<p>→ <strong>結構必須跟差異維度對位、不能反向假設</strong>。</p>
<hr>
<h2 id="diff-dimension-audit寫作前的必要-step">Diff dimension audit：寫作前的必要 step</h2>
<p>寫 process content 前先做 audit、列出 source 跟 target 在 6 個維度的差異程度：</p>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>評估問題</th>
          <th>High / Medium / Low</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Schema / API</td>
          <td>source 跟 target 的 API、data model、wire protocol 差異多大？</td>
          <td>-</td>
      </tr>
      <tr>
          <td>Operational model</td>
          <td>HA / backup / monitoring / capacity 邏輯差異多大？</td>
          <td>-</td>
      </tr>
      <tr>
          <td>Abstraction / paradigm</td>
          <td>兩端是否同類產品（同抽象層）？</td>
          <td>-</td>
      </tr>
      <tr>
          <td>Number of components</td>
          <td>一站式 vs multi-tool 是否需要拆分？</td>
          <td>-</td>
      </tr>
      <tr>
          <td>Application change</td>
          <td>application code 需要改多少？</td>
          <td>-</td>
      </tr>
      <tr>
          <td><strong>Data topology</strong></td>
          <td><strong>Sharding / partition / region / replication 拓樸是否變動？</strong></td>
          <td>-</td>
      </tr>
  </tbody>
</table>
<p>主導差異維度對映常見 type：</p>
<ul>
<li><strong>Schema = High（其他 Low）</strong> → Type A phased rule translation</li>
<li><strong>Operational = High（其他 Low）</strong> → Type C operational redesign hybrid</li>
<li><strong>Paradigm = High</strong> → Type E partial + 混合架構</li>
<li><strong>Components = High（一站式 → multi-tool）</strong> → Type D parallel streams</li>
<li><strong>Topology = High（其他 Low）</strong> → Type F topology re-layout（見 <a href="../data-topology-as-audit-dimension/">#128</a>）</li>
<li><strong>全 Low</strong> → Type B drop-in、6-section + audit prefix</li>
</ul>
<p>第 6 維 <em>Data topology</em> 是後續從 Redis cluster re-sharding dogfood 浮現補位、見 <a href="../data-topology-as-audit-dimension/">#128 Data topology 是 process content 的第 6 audit 維度</a>；本卡原為 5 維 audit、被第二輪 batch evidence 揭露盲點後擴張為 6 維。</p>
<h2 id="多重歸類跟-tie-breaking">多重歸類跟 tie-breaking</h2>
<p>實際 source / target 配對 <em>很少</em> 完美對映單一 type；常見情境跟處理規則：</p>
<table>
  <thead>
      <tr>
          <th>情境</th>
          <th>例</th>
          <th>處理規則</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>兩維度都 High</td>
          <td>PostgreSQL → CockroachDB（Schema + Operational + Paradigm 三 High）</td>
          <td>主結構選 <em>讀者最關心</em> 的維度（多數情境 Schema &gt; Paradigm &gt; Operational &gt; Topology &gt; Components）、其他維度抽出獨立段補充</td>
      </tr>
      <tr>
          <td>三維度都 High</td>
          <td>同上</td>
          <td>結構走 Type E（paradigm 為主、partial + 混合）、用「為什麼這不是 drop-in」段交代另外兩維度</td>
      </tr>
      <tr>
          <td>全 Medium（無 High）</td>
          <td>Redis → KeyDB（API 微差 + ops 微差）</td>
          <td>走 Type B drop-in、用「相容性 audit」段列 medium 差異點</td>
      </tr>
      <tr>
          <td>一維 High 但 <em>application change</em> 連帶 High</td>
          <td>MySQL → PostgreSQL（Schema High + SQL dialect 連帶 application 改）</td>
          <td>走 Type A、application change 章節獨立段、不壓進 Phase 4 cutover</td>
      </tr>
      <tr>
          <td>Schema High + Components High</td>
          <td>Splunk → Elastic + Tines + PagerDuty</td>
          <td>主結構走 Type A（Schema 為主驅動 phased translation）、Type D 的 multi-tool 用「target stack 拆分」獨立段</td>
      </tr>
  </tbody>
</table>
<p>關鍵原則：<strong>主導維度決定主結構、其他高維度獨立加段</strong>、不強迫單一 type 標籤。Backlog 的「Type A/D 混合」「Type B/D 混合」標示是 <em>維度組合</em> 的簡記、不是承認 5 type 互斥失效；下表多重歸類處理規則才是正式判讀。</p>
<h2 id="6-type-是-axis-aligned-simplification非窮盡">6 type 是 axis-aligned simplification、非窮盡</h2>
<p>本卡 6 type 來自兩輪 migration playbook 的 dogfood 觀察（第一輪 5 篇 → Type A-E、第二輪 Redis cluster re-sharding → Type F）、是 <em>已浮現的 type</em>、不是 <em>涵蓋所有 migration 的完備分類</em>。已知漏類至少 3 種：</p>
<table>
  <thead>
      <tr>
          <th>漏類</th>
          <th>例</th>
          <th>為何現有 type 不覆蓋</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>同 vendor major version upgrade</td>
          <td>PostgreSQL 14 → 17 / Kafka 3 → 4</td>
          <td>Source / target 是同 vendor、現有 type 預設跨 vendor、deep article methodology 也不完全 cover</td>
      </tr>
      <tr>
          <td>政策 / 合規驅動</td>
          <td>Atlassian server EOL / PCI 強制資料 region</td>
          <td>Driver 在外部、但資料層仍走 type A-F 之一；audit 重點是 evidence collection、不是結構</td>
      </tr>
      <tr>
          <td><del>容量重新規劃 / re-sharding</del> resolved</td>
          <td><del>單實例 → sharded / 單 region → multi-region</del></td>
          <td><del>Source / target 同 vendor、無 schema / paradigm 差、但 data topology 重劃；5 維度沒「topology」軸</del> — <strong>第二輪後已被 Type F 涵蓋</strong>、見 <a href="../data-topology-as-audit-dimension/">#128</a></td>
      </tr>
      <tr>
          <td>Acquisition / merger consolidation</td>
          <td>兩 Datadog org 合併 / 兩 K8s cluster federate</td>
          <td>Source / target 同產品、要處理 identity / RBAC / 歷史資料合併；6 type 不覆蓋</td>
      </tr>
  </tbody>
</table>
<p>未來累積更多 migration playbook 後、可能浮現第 7-9 type（identity / consistency / residency 候選 — 對應 <a href="../data-topology-as-audit-dimension/">#128</a> 跟 self-aware limitation update 揭露的候選軸）、或對 6 type 重構。本卡的 type 集合是 <em>open</em>、不是 <em>closed</em>。</p>
<hr>
<h2 id="6-種結構的-anatomy">6 種結構的 anatomy</h2>
<p>**「結構 differentiator」**是本系列引入的概念：每篇 process content 在開頭加一段、<em>明示這篇用什麼結構、跟其他同 category content 的結構差異在哪</em>。功能類似 type signature — 讓讀者一開始就知道接下來的章節組織方式、避免套錯預期。例：drop-in migration 的「結構 differentiator」段會說「跟 phased migration 對照、本篇是 6-section + audit、不是 6-phase」。</p>
<h3 id="type-aphased-translationschema-差為主">Type A：Phased translation（schema 差為主）</h3>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">Phase 0 audit → Phase 1 schema 對位 → Phase 2 translation
</span></span><span class="line"><span class="ln">2</span><span class="cl">→ Phase 3 parallel run → Phase 4 cutover → Phase 5 cleanup</span></span></code></pre></div><p>特徵：</p>
<ul>
<li><em>線性</em> 流程、phase 之間有 dependency</li>
<li>每 phase 有獨立 <em>回退邊界</em></li>
<li>Schema translation 是工作量主軸（4-12 週）</li>
</ul>
<p>適用：Splunk → Elastic / Datadog APM → New Relic / MySQL → Postgres</p>
<h3 id="type-b6-section--audit-prefixdrop-in-compatible">Type B：6-section + audit prefix（drop-in compatible）</h3>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">為什麼遷 → 結構 differentiator → 相容性 audit
</span></span><span class="line"><span class="ln">2</span><span class="cl">→ Step-by-step cutover → 故障演練 → Capacity → 整合</span></span></code></pre></div><p>特徵：</p>
<ul>
<li>接近 deep article 6-section</li>
<li>多一段 <em>相容性 audit</em>（在 cutover 前列出風險點）</li>
<li>不需要 phased、單次 cutover</li>
</ul>
<p>適用：Redis → DragonflyDB / OpenJDK → Adoptium / MariaDB → MySQL（部分版本）</p>
<h3 id="type-coperational-redesign-hybrid">Type C：Operational redesign hybrid</h3>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">為什麼遷 → 結構 differentiator → Operational redesign 對位
</span></span><span class="line"><span class="ln">2</span><span class="cl">→ 4-phase operational migration（Phase 0 audit + 3 active phase）→ Drop-in cutover → 故障演練 → Capacity → 整合</span></span></code></pre></div><p>特徵：</p>
<ul>
<li>application code 不變、operational model 全換</li>
<li><em>operational 表格對位</em> 是內容主軸</li>
<li>Cutover 本身簡單（protocol 相容）、operational 準備複雜</li>
</ul>
<p>適用：PostgreSQL → Aurora / Self-managed Redis → ElastiCache / Self-managed Kafka → MSK</p>
<h3 id="type-dparallel-streamsmulti-tool-拆分">Type D：Parallel streams（multi-tool 拆分）</h3>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">為什麼遷 → 五個責任、五個 component → 5 parallel migration stream
</span></span><span class="line"><span class="ln">2</span><span class="cl">→ Stream-level audit / deploy / dual-ship / cutover → 故障演練 → Capacity → 整合</span></span></code></pre></div><p>特徵：</p>
<ul>
<li>source 一站式、target N 個專責 component</li>
<li>每個 stream 獨立 audit / deploy / cutover、stream 間少 dependency</li>
<li>整體不是線性、是 <em>staggered parallel</em></li>
</ul>
<p>適用：Datadog → Grafana Stack / Splunk → Elastic + Tines + PagerDuty / Atlassian Suite → 各 specialized tool</p>
<h3 id="type-epartial--混合架構paradigm-shift">Type E：Partial + 混合架構（paradigm shift）</h3>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">「不是 migration、是 paradigm 重設計」→ Paradigm 對位
</span></span><span class="line"><span class="ln">2</span><span class="cl">→ 什麼情境真的能換 → Application 重設計 → 部分 stream cutover → 長期混合架構</span></span></code></pre></div><p>特徵：</p>
<ul>
<li>不存在「complete migration」、是 <em>按 use case 拆分 + 共存</em></li>
<li>application 模式重設計（不是 SDK 換）</li>
<li><em>混合架構是 long-term default</em></li>
</ul>
<p>適用：Kafka ↔ NATS / REST → gRPC / SQL → NoSQL / VM → Serverless</p>
<h3 id="type-ftopology-re-layoutdata-topology--high">Type F：Topology re-layout（data topology = High）</h3>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">為什麼 re-layout → 結構 differentiator（re-layout 不是 migration）
</span></span><span class="line"><span class="ln">2</span><span class="cl">→ Pre-layout analysis（topology audit）→ Re-layout 機制
</span></span><span class="line"><span class="ln">3</span><span class="cl">→ Execution flow（per-step + rollback boundary）
</span></span><span class="line"><span class="ln">4</span><span class="cl">→ 故障演練 → Capacity / cost → 整合</span></span></code></pre></div><p>特徵：</p>
<ul>
<li>Source / target 多數是 <em>同 cluster 不同 state</em>、不是跨 vendor</li>
<li>主軸是 <em>topology audit + 重劃機制</em>、不是 schema translation / paradigm shift</li>
<li>Pre-layout analysis（識別 hot key / 當前 distribution）是 Type F 的核心 audit 段</li>
<li>Execution flow per-step、含 <em>rollback boundary</em></li>
</ul>
<p>適用：Redis cluster re-sharding / PostgreSQL partition redesign / Kafka topic re-partitioning / Cassandra keyspace re-balance / 加 region / multi-master rollout</p>
<p>詳細 audit dimension 跟 sub-dimension 見 <a href="../data-topology-as-audit-dimension/">#128 Data topology 是 process content 的第 6 audit 維度</a>。</p>
<hr>
<h2 id="跟-deep-article-methodology-的關係">跟 deep article methodology 的關係</h2>
<p><a href="/blog/posts/vendor-%E6%B7%B1%E5%BA%A6%E6%8A%80%E8%A1%93%E6%96%87%E7%AB%A0%E6%96%B9%E6%B3%95%E8%AB%96%E7%9A%84%E6%BC%94%E5%8C%96%E7%B4%80%E9%8C%84%E5%90%8C-vendor-%E7%B3%BB%E5%88%97%E7%9A%84%E9%96%8B%E5%A0%B4%E8%BC%AA%E6%9B%BF%E9%A9%97%E8%AD%89/" data-link-title="Vendor 深度技術文章方法論的演化紀錄：同 vendor 系列的開場輪替驗證" data-link-desc="vendor overview 飽和後要寫單一功能深度文章、需要選題與結構依據時回來。這套方法論的驗證來源與 cadence variant 在高風險場景（同 vendor sub-tool 系列）的實證。">Deep article methodology</a> 的 6-section structure（問題情境 → 概念 → 配置 → 演練 → 容量 → 整合）是 <em>single feature implementation</em> 的模板、不是 <em>cross-vendor process</em> 的模板。Migration playbook 是 <em>新 content category</em>、需要自己的 methodology。</p>
<p>兩者關係：</p>
<ul>
<li><strong>Single feature deep article</strong>：6-section、200-400 行、focused on <em>how to implement / debug feature X</em></li>
<li><strong>Migration playbook</strong>：6 種 structure（依 diff dimension）、200-400 行 / 篇、focused on <em>how to move from A to B</em></li>
<li>共同：問題情境 / 故障演練 / 容量 / 整合段；差異：中間「process / structure」段</li>
</ul>
<p>寫前的 <em>content category 判讀</em> 是新方法論議題、不是 deep article methodology 涵蓋。</p>
<hr>
<h2 id="反模式">反模式</h2>
<table>
  <thead>
      <tr>
          <th>反模式</th>
          <th>後果</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>寫 migration playbook 前不做 diff dimension audit</td>
          <td>套錯結構模板、phase 變空白或 process 強行線性</td>
      </tr>
      <tr>
          <td>假設「migration 都 phased」</td>
          <td>drop-in / paradigm shift 套 phased 結構失真</td>
      </tr>
      <tr>
          <td>假設「跟 deep article methodology 一樣」</td>
          <td>6-section 套 cross-vendor process 缺 differentiation</td>
      </tr>
      <tr>
          <td>跨 type 強行套同一個結構</td>
          <td>5 種 type 內容差異被壓平、跨篇連讀預期化</td>
      </tr>
      <tr>
          <td>沒列「結構 differentiator」段</td>
          <td>讀者不知道為什麼這篇結構跟其他 migration playbook 不同</td>
      </tr>
      <tr>
          <td>Diff dimension audit 只看 schema</td>
          <td>忽略 operational / paradigm / components 維度、套錯結構</td>
      </tr>
      <tr>
          <td>把混合架構 paradigm shift 寫成 phased</td>
          <td>假設 source 會消失、cleanup phase 變 fiction</td>
      </tr>
      <tr>
          <td>把 drop-in 寫成 phased</td>
          <td>多 phase 變空白、文章拉長但無內容</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係</h2>
<table>
  <thead>
      <tr>
          <th>原則</th>
          <th>關係</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="../cadence-homogenization-in-batch-writing/">#122 Cadence 同質化是模板的隱形維度</a></td>
          <td>補位 — #122 處理 <em>同 type 內的 framing collapse</em>、本卡處理 <em>跨 type 套錯結構</em>；兩者都跟「主題語意 attractor」相關</td>
      </tr>
      <tr>
          <td><a href="../ease-of-writing-vs-intent-alignment/">#67 寫作便利度跟意圖對齊反相關</a></td>
          <td>同骨 — 套既有結構模板最便利（不用判 diff dimension）、但意圖（跟主題本質對位）失準</td>
      </tr>
      <tr>
          <td><a href="../collapse-is-implicit-default/">#125 Collapse 是隱形預設</a></td>
          <td>子實例 — 結構模板 collapse 到單一 type 是 #125 在「content structure」surface 的具體形態</td>
      </tr>
      <tr>
          <td><a href="../standard-driven-vs-case-driven-domain-judgment/">#118 Standard-driven vs case-driven domain judgment</a></td>
          <td>Sibling — 兩卡都是 <em>寫作前的 domain audit</em>、#118 判 case-driven vs standard-driven、本卡判 process structure type</td>
      </tr>
      <tr>
          <td><a href="../routing-layer-chapter-recognition/">#119 章節已有 routing skeleton 走補強段</a></td>
          <td>同骨 — 都是「結構辨識先於內容生成」、#119 是章節內、本卡是文章層</td>
      </tr>
      <tr>
          <td><a href="../data-topology-as-audit-dimension/">#128 Data topology 是 process content 的第 6 audit 維度</a></td>
          <td>子卡 — 本卡 audit 框架從 5 維擴張到 6 維、新增 Type F；#128 是 6 維 audit 的 atomic 定義跟 Type F 詳細 anatomy</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="判讀徵兆">判讀徵兆</h2>
<table>
  <thead>
      <tr>
          <th>訊號</th>
          <th>該做的事</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>寫 migration playbook 前直覺套「6 phase」</td>
          <td>先跑 diff dimension audit、可能 type A-E 對應不同結構</td>
      </tr>
      <tr>
          <td>寫到一半某 phase 內容空白</td>
          <td>結構錯位、可能不需要這個 phase</td>
      </tr>
      <tr>
          <td>兩篇同 category content 連讀差異不大</td>
          <td>結構過於 universal、缺結構 differentiator 段</td>
      </tr>
      <tr>
          <td>「cleanup phase」寫不出內容</td>
          <td>可能是 paradigm shift type、source 不會消失</td>
      </tr>
      <tr>
          <td>章節數 ≥ 15 還沒寫完</td>
          <td>結構過 phased、考慮是不是 type B / E 不需要這麼多</td>
      </tr>
      <tr>
          <td>章節 4 「故障演練」段比其他段都簡單</td>
          <td>結構過 abstract、實作層細節缺</td>
      </tr>
      <tr>
          <td>寫作前沒列 source / target 的 diff dimension</td>
          <td>結構 risk、補 audit</td>
      </tr>
  </tbody>
</table>
<p><strong>核心</strong>：Process content 的結構由 <em>source / target 差異維度組合</em> 決定、不是 universal phased / 6-section 模板。寫作前必須跑 <em>6 維 diff dimension audit</em>（schema / operational / paradigm / components / application change / data topology）、選對應主結構、其他高維度獨立加段；跳過 audit 會套錯模板、phase 變空白或 process 強行線性。</p>
<hr>
<h2 id="self-aware-limitation本卡的-sample-driven-over-fit-風險">Self-aware limitation：本卡的 sample-driven over-fit 風險</h2>
<p>本卡 5 type 來自 5 篇 migration playbook 的 dogfood 觀察、本身就是 <em>N=5 sample 推導出 5 type taxonomy</em> — 跟本卡批判的「universal phased 模板」「<a href="../cadence-homogenization-in-batch-writing/">#122</a> cadence collapse」「<a href="../collapse-is-implicit-default/">#125</a> reduce 多維到單格」是 <em>同骨錯誤</em>。</p>
<table>
  <thead>
      <tr>
          <th>Reviewer 揭露的本卡 over-fit</th>
          <th>對應的本卡建議</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>5 type 非窮盡（漏 4 種主流情境）</td>
          <td>「5 type 是 axis-aligned simplification、非窮盡」段、未來累積更多 sample 後可能重構</td>
      </tr>
      <tr>
          <td>5 type 互斥失效（多軸 High 配對）</td>
          <td>「多重歸類跟 tie-breaking」段、不強迫單一 type 標籤</td>
      </tr>
      <tr>
          <td>「最大維度」沒處理 tie</td>
          <td>主導維度判讀規則（Schema &gt; Paradigm &gt; Operational &gt; Topology &gt; Components；audience-dependent heuristic）</td>
      </tr>
      <tr>
          <td>「Partial collapse 教育價值高」是 post-hoc</td>
          <td>修正為 <a href="../cadence-homogenization-in-batch-writing/">#122 Update 段第 8 點</a> — partial collapse 是 attractor 訊號、不增強 principle</td>
      </tr>
  </tbody>
</table>
<p>本卡是 <em>current best understanding</em>、不是 <em>已驗證的完備理論</em>。Tripwire：</p>
<ul>
<li>若下一輪 migration batch 浮現 <em>無法歸進現有 5 type 的新 structure</em>、應該擴充 type 集合而不是強行歸類</li>
<li>若同一 source/target 配對出現 <em>結構翻轉</em>（例 PostgreSQL → CockroachDB 在不同 application context 走不同主結構）、應該檢視 <em>主導維度</em> 規則是否需要動態化</li>
<li>若 type 數量擴張到 8+、應該評估是否該重構為 <em>維度 × 維度 grid</em> 而不是 type list</li>
</ul>
<hr>
<p>承認 limitation 本身是 dogfood — <a href="../cadence-homogenization-in-batch-writing/">#122 cadence 同質化</a> 講「natural attractor 不規劃就 collapse」、本卡的 5 type 就是 <em>5 個 sample 的 natural attractor</em>；不在卡內承認、就重複了 <a href="../collapse-is-implicit-default/">#125 隱形預設</a> 的 collapse pattern。本段是 self-correction、不是 disclaimer。</p>
<h3 id="update2026-05-19第二輪-migration-batch-驗證-limitation">Update（2026-05-19）：第二輪 migration batch 驗證 limitation</h3>
<p>第二輪 migration batch（5 篇）跑完、self-aware limitation 三項預測得到驗證：</p>
<table>
  <thead>
      <tr>
          <th>預測（self-aware limitation 段）</th>
          <th>第二輪實證</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>漏類確實存在、未來累積更多 sample 後可能重構</td>
          <td>major version upgrade（<a href="/blog/backend/01-database/vendors/postgresql/major-version-upgrade/" data-link-title="PostgreSQL major version upgrade (14 → 17)：為什麼這篇不套 5 type migration" data-link-desc="PostgreSQL major version upgrade 是 *5 type 漏類* 的實證 — source/target 同 vendor、5 維度都 Low 但 *upgrade-specific audit* 是核心；本文結構接近 deep article methodology 的 6-section &#43; 額外 upgrade audit 段；涵蓋 pg_upgrade / logical replication / blue-green 三方法、extension 相容性、5 production 踩雷">postgresql/major-version-upgrade</a>）跟 re-sharding（<a href="/blog/backend/02-cache-redis/vendors/redis/cluster-resharding/" data-link-title="Redis Cluster Re-sharding：source = target，但 topology 重劃的 5 段流程" data-link-desc="Redis cluster re-sharding 是 5 type migration 漏類實證 — source / target 同 cluster、無 schema / paradigm 差、但 16384 slot 重分配是核心；本文涵蓋 4 種 re-sharding driver、slot migration 機制、redis-cli --cluster rebalance / reshard 工具、5 個 production 踩雷（cluster busy / replica lag / client cache stale / cross-slot transaction / monitor gap）">redis/cluster-resharding</a>）結構跟 5 type 完全不同、各有自己的 anatomy；漏類確認</td>
      </tr>
      <tr>
          <td>Multi-axis 處理規則（主導維度 + 高維度獨立段）</td>
          <td><a href="/blog/backend/01-database/vendors/postgresql/migrate-to-cockroachdb/" data-link-title="PostgreSQL → CockroachDB：三維皆 High 的多重歸類 migration" data-link-desc="PostgreSQL → CockroachDB 是 Schema / Operational / Paradigm 三維皆 High 的 multi-axis migration、實證 [#127](/report/content-structure-by-max-diff-dimension/) 的「多重歸類跟 tie-breaking」規則；主結構走 Type E paradigm shift、Schema 差 &#43; Operational redesign 抽出獨立段；涵蓋 transaction model 重設計、SQL dialect gap、5 個 production 踩雷">postgresql/migrate-to-cockroachdb</a> 三維皆 High、結構 = Type E 主結構 + Type A schema gap 段 + Type C operational redesign 段、不強迫單一 type 標籤；規則成立</td>
      </tr>
      <tr>
          <td>Type A / Type C 標準形態仍適用</td>
          <td><a href="/blog/backend/01-database/vendors/mysql/migrate-to-postgresql/" data-link-title="MySQL → PostgreSQL：從 SQL dialect diff 跑出來的 Type A 6-phase migration" data-link-desc="MySQL → PostgreSQL 是 Type A 高 schema 差 migration 的標準形態 — SQL dialect / collation / case sensitivity / replication 模型差異主導；用 pgloader / AWS DMS / 自管 dual-write 三條 path、5 個 production 踩雷（auto_increment vs SERIAL / charset 跟 collation / case sensitivity / index syntax / triggers）">mysql/migrate-to-postgresql</a>（Type A）+ <a href="/blog/backend/01-database/vendors/mongodb/migrate-to-atlas/" data-link-title="MongoDB → Atlas：Atlas 不是 MongoDB &#43; managed、是另一個 product" data-link-desc="Atlas 號稱「MongoDB managed」但 operational model 完全不同（auto-scaling / VPC peering / IAM-driven access / 內建 backup / billing 模型）；本文採用 Type C operational redesign hybrid 結構、4-phase operational migration &#43; drop-in cutover、5 個 production 踩雷（連線數限制 / IP whitelist / backup retention / IAM token 過期 / billing 暴漲）">mongodb/migrate-to-atlas</a>（Type C）走標準模板、跟第一輪同 type 對應；標準形態驗證</td>
      </tr>
  </tbody>
</table>
<p>新發現（不在 self-aware limitation 預測內、需要後續處理）：</p>
<ul>
<li><strong>新 audit 維度浮現</strong>：re-sharding 揭露「data topology」是 5 維沒有的軸；audit 擴張為 6 維（加 topology 軸）已執行、見 <a href="../data-topology-as-audit-dimension/">#128 Data topology 是 process content 的第 6 audit 維度</a> + 本卡 audit table 新加 row 跟 Type F anatomy</li>
<li><strong>「為什麼這篇不套」是漏類文章的好結構模板</strong>：major-version-upgrade 跟 cluster-resharding 都用這個 frame 開頭、明示跟 5 type 的邊界</li>
<li><strong>「高維度獨立段」對照表</strong>自然在 multi-axis 文章浮現（cockroachdb 篇）— 應該升級為 multi-axis migration 的標準結構元素</li>
</ul>
<h3 id="update2026-05-19-第三輪-4-reviewer-audit-後6-維擴張的未解結構性質疑">Update（2026-05-19 第三輪 4-reviewer audit 後）：6 維擴張的未解結構性質疑</h3>
<p>第三輪 audit 揭露本卡擴 6 維 + Type F 仍有 6 項未解結構性 issue。完整列表跟 acknowledgment 見 <a href="../data-topology-as-audit-dimension/">#128 Self-aware limitation 段</a>、本卡這裡 cross-reference：</p>
<ol>
<li><strong>6 維非窮盡</strong>：identity / consistency / residency 三軸候選</li>
<li><strong>Type F 跟 Type B 結構重疊度高</strong>：實質差異只 2 段、可能下次 evolution 降為 Type B variant</li>
<li><strong>「不需要 parallel run」claim 部分不成立</strong>（multi-region rollout 例外）</li>
<li><strong>主導維度優先序是 audience-dependent heuristic</strong>、非 universal</li>
<li><strong>「topology 不能塞進既有 5 維」拒絕理由依賴 narrow 既有 5 維定義</strong></li>
<li><strong>既有 5 篇 playbook 沒 retroactive audit</strong>（silent grandfathering）</li>
</ol>
<p>本卡的 6 type / 6 維框架是 <em>current best understanding</em>、不是 <em>final taxonomy</em>；累積到 10+ migration playbook 後可能觸發 retroactive audit + framework restructure。</p>
]]></content:encoded></item><item><title>Data topology 是 process content 的第 6 audit 維度</title><link>https://tarrragon.github.io/blog/report/data-topology-as-audit-dimension/</link><pubDate>Tue, 19 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/report/data-topology-as-audit-dimension/</guid><description>&lt;h2 id="結論">結論&lt;/h2>
&lt;p>Process content 的 &lt;a href="../content-structure-by-max-diff-dimension/">diff dimension audit&lt;/a> 原本 5 維 — schema / operational / paradigm / components / application change — 漏了 &lt;em>data topology&lt;/em> 這軸。Topology 是 &lt;em>資料在 cluster / partition / region 之間的分佈拓樸&lt;/em>、跟既有 5 維任一個都不對等：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>維度&lt;/th>
 &lt;th>處理對象&lt;/th>
 &lt;th>對 topology 的關係&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Schema / API&lt;/td>
 &lt;td>資料結構（column / type / index）&lt;/td>
 &lt;td>不同層、schema 不變 topology 可能變&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Operational model&lt;/td>
 &lt;td>運維 stack（HA / backup / monitoring）&lt;/td>
 &lt;td>topology 可能影響 ops、但不是同一概念&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Paradigm&lt;/td>
 &lt;td>核心抽象（OLTP / log / pub-sub）&lt;/td>
 &lt;td>同 paradigm 內 topology 可變&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Components&lt;/td>
 &lt;td>元件數量（1 vs N）&lt;/td>
 &lt;td>同 component 數可有不同 topology&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Application change&lt;/td>
 &lt;td>application code 改動量&lt;/td>
 &lt;td>topology 變不必然 application 改&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Data topology&lt;/strong>&lt;/td>
 &lt;td>&lt;strong>slot / shard / partition / region 分佈&lt;/strong>&lt;/td>
 &lt;td>&lt;strong>本卡新增的第 6 維&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Data topology 是 &lt;em>資料分佈&lt;/em> 層級的概念&lt;/strong> — 跟資料結構（schema）、運維機制（operational）、抽象模型（paradigm）、組件數量（components）、application code 改動量（application change）並列為第 6 軸；topology 變動時其他 5 維可能完全不變、但 &lt;em>資料在 cluster / partition / region 之間的擺放方式&lt;/em> 改變、需要獨立的結構處理。&lt;/p>
&lt;p>擴 audit 到 6 維、新增 &lt;a href="../content-structure-by-max-diff-dimension/">Type F「Topology re-layout」&lt;/a> 結構對映 &lt;em>topology 高差異&lt;/em> 的 process content。&lt;/p>
&lt;h2 id="topology-的-5-個-sub-dimension">Topology 的 5 個 sub-dimension&lt;/h2>
&lt;p>不同 source/target 配對對 topology 的影響不同、用 5 sub-dimension 描述具體變化：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Sub-dimension&lt;/th>
 &lt;th>內容&lt;/th>
 &lt;th>例&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Sharding strategy&lt;/td>
 &lt;td>Slot / hash / range / consistent hash / key-based&lt;/td>
 &lt;td>Redis cluster slot 重分配&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Partition strategy&lt;/td>
 &lt;td>Declarative / range / list / hash / sub-partition&lt;/td>
 &lt;td>PostgreSQL monthly → daily partition&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Replication topology&lt;/td>
 &lt;td>Single primary / multi-master / star / hub-spoke / mesh&lt;/td>
 &lt;td>Single primary → multi-master 切換、或加 logical replication subscriber&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Region distribution&lt;/td>
 &lt;td>Single / multi-AZ / multi-region / global&lt;/td>
 &lt;td>Cassandra single DC → multi-DC&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Co-location / locality&lt;/td>
 &lt;td>Locality-aware queries / row-level region pinning&lt;/td>
 &lt;td>CockroachDB region 強制 row 對應&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>任一 sub-dimension 變動就構成 topology layout 變動；多個 sub-dimension 同時變更（如「sharding strategy + region distribution 同時改」）是 &lt;em>complex topology migration&lt;/em>、結構複雜度高。&lt;/p></description><content:encoded><![CDATA[<h2 id="結論">結論</h2>
<p>Process content 的 <a href="../content-structure-by-max-diff-dimension/">diff dimension audit</a> 原本 5 維 — schema / operational / paradigm / components / application change — 漏了 <em>data topology</em> 這軸。Topology 是 <em>資料在 cluster / partition / region 之間的分佈拓樸</em>、跟既有 5 維任一個都不對等：</p>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>處理對象</th>
          <th>對 topology 的關係</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Schema / API</td>
          <td>資料結構（column / type / index）</td>
          <td>不同層、schema 不變 topology 可能變</td>
      </tr>
      <tr>
          <td>Operational model</td>
          <td>運維 stack（HA / backup / monitoring）</td>
          <td>topology 可能影響 ops、但不是同一概念</td>
      </tr>
      <tr>
          <td>Paradigm</td>
          <td>核心抽象（OLTP / log / pub-sub）</td>
          <td>同 paradigm 內 topology 可變</td>
      </tr>
      <tr>
          <td>Components</td>
          <td>元件數量（1 vs N）</td>
          <td>同 component 數可有不同 topology</td>
      </tr>
      <tr>
          <td>Application change</td>
          <td>application code 改動量</td>
          <td>topology 變不必然 application 改</td>
      </tr>
      <tr>
          <td><strong>Data topology</strong></td>
          <td><strong>slot / shard / partition / region 分佈</strong></td>
          <td><strong>本卡新增的第 6 維</strong></td>
      </tr>
  </tbody>
</table>
<p><strong>Data topology 是 <em>資料分佈</em> 層級的概念</strong> — 跟資料結構（schema）、運維機制（operational）、抽象模型（paradigm）、組件數量（components）、application code 改動量（application change）並列為第 6 軸；topology 變動時其他 5 維可能完全不變、但 <em>資料在 cluster / partition / region 之間的擺放方式</em> 改變、需要獨立的結構處理。</p>
<p>擴 audit 到 6 維、新增 <a href="../content-structure-by-max-diff-dimension/">Type F「Topology re-layout」</a> 結構對映 <em>topology 高差異</em> 的 process content。</p>
<h2 id="topology-的-5-個-sub-dimension">Topology 的 5 個 sub-dimension</h2>
<p>不同 source/target 配對對 topology 的影響不同、用 5 sub-dimension 描述具體變化：</p>
<table>
  <thead>
      <tr>
          <th>Sub-dimension</th>
          <th>內容</th>
          <th>例</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Sharding strategy</td>
          <td>Slot / hash / range / consistent hash / key-based</td>
          <td>Redis cluster slot 重分配</td>
      </tr>
      <tr>
          <td>Partition strategy</td>
          <td>Declarative / range / list / hash / sub-partition</td>
          <td>PostgreSQL monthly → daily partition</td>
      </tr>
      <tr>
          <td>Replication topology</td>
          <td>Single primary / multi-master / star / hub-spoke / mesh</td>
          <td>Single primary → multi-master 切換、或加 logical replication subscriber</td>
      </tr>
      <tr>
          <td>Region distribution</td>
          <td>Single / multi-AZ / multi-region / global</td>
          <td>Cassandra single DC → multi-DC</td>
      </tr>
      <tr>
          <td>Co-location / locality</td>
          <td>Locality-aware queries / row-level region pinning</td>
          <td>CockroachDB region 強制 row 對應</td>
      </tr>
  </tbody>
</table>
<p>任一 sub-dimension 變動就構成 topology layout 變動；多個 sub-dimension 同時變更（如「sharding strategy + region distribution 同時改」）是 <em>complex topology migration</em>、結構複雜度高。</p>
<h2 id="為什麼-topology-不能塞進既有-5-維">為什麼 topology 不能塞進既有 5 維</h2>
<p>Reviewer 質疑：為什麼不直接歸進 operational 或 paradigm？三個拒絕理由：</p>
<ol>
<li><strong>Schema 不變但 topology 變</strong>：PostgreSQL <code>partition strategy</code> 改（monthly → daily）— schema 完全相同、partition boundary 重劃；歸 Schema 維度錯位</li>
<li><strong>Operational stack 不變但 topology 變</strong>：Redis cluster 加 node 重分 slot — Sentinel / monitoring / backup 不變、純粹是 slot mapping 重劃；歸 Operational 維度太寬</li>
<li><strong>Paradigm 不變但 topology 變</strong>：Cassandra 從 single DC 加到 multi-DC — 同 distributed DB paradigm、co-location / replication topology 變；歸 Paradigm 維度誤導</li>
<li><strong>Components 不變但 topology 變</strong>：Kafka topic re-partition（10 partitions → 100）— 同 1 個 cluster、partition count 變；歸 Components 維度錯位</li>
</ol>
<p>Topology 是 <em>獨立的問題軸</em>、5 維 audit 漏掉時會誤判結構。</p>
<h2 id="觸發-type-f-的情境">觸發 Type F 的情境</h2>
<table>
  <thead>
      <tr>
          <th>情境</th>
          <th>Topology 變化</th>
          <th>是否同 vendor</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Cluster re-sharding</td>
          <td>Slot / shard 重分配</td>
          <td>yes</td>
      </tr>
      <tr>
          <td>Partition redesign</td>
          <td>Partition boundary / strategy 重劃</td>
          <td>yes</td>
      </tr>
      <tr>
          <td>Single-region → multi-region</td>
          <td>Region distribution + replication topology 雙變</td>
          <td>多數 yes（同 vendor 加 region）</td>
      </tr>
      <tr>
          <td>Multi-master rollout</td>
          <td>Replication topology 從 single primary 變 multi-master</td>
          <td>yes</td>
      </tr>
      <tr>
          <td>DynamoDB GSI / global tables</td>
          <td>Sharding + replication 雙變</td>
          <td>yes</td>
      </tr>
      <tr>
          <td>Kafka topic re-partitioning</td>
          <td>Sharding strategy 變</td>
          <td>yes</td>
      </tr>
      <tr>
          <td>Cassandra keyspace re-balance</td>
          <td>Replication factor（sub-dim 3）+ token range（sub-dim 1）雙變</td>
          <td>yes</td>
      </tr>
      <tr>
          <td>MongoDB sharded cluster 加 shard</td>
          <td>Sharding 重分布</td>
          <td>yes</td>
      </tr>
  </tbody>
</table>
<p>多數 Type F 場景是 <em>同 vendor</em> — 跟 <a href="../content-structure-by-max-diff-dimension/">#127</a> Type A-E 預設「跨 vendor」對應、Type F 是 <em>同 vendor 內 topology 重劃</em>。</p>
<h2 id="6-維-audit-decision-ruleupdated">6 維 audit decision rule（updated）</h2>
<p>擴 audit 到 6 維後、type 對映規則更新：</p>
<table>
  <thead>
      <tr>
          <th>維度組合</th>
          <th>對映 type</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Schema = High（其他 Low）</td>
          <td>Type A phased rule translation</td>
      </tr>
      <tr>
          <td>全 Low</td>
          <td>Type B drop-in</td>
      </tr>
      <tr>
          <td>Operational = High（其他 Low）</td>
          <td>Type C operational redesign hybrid</td>
      </tr>
      <tr>
          <td>Components = High</td>
          <td>Type D parallel streams</td>
      </tr>
      <tr>
          <td>Paradigm = High</td>
          <td>Type E partial + 混合架構</td>
      </tr>
      <tr>
          <td><strong>Topology = High（其他 Low）</strong></td>
          <td><strong>Type F topology re-layout</strong>（本卡新增）</td>
      </tr>
      <tr>
          <td>多軸 High</td>
          <td>按 <a href="../content-structure-by-max-diff-dimension/">#127 多重歸類</a> 規則</td>
      </tr>
  </tbody>
</table>
<p>主導維度判讀的優先序也擴張：Schema &gt; Paradigm &gt; Operational &gt; Topology &gt; Components。Topology 在 schema / paradigm / operational 之後、components 之前 — 因為 topology 對讀者 conceptual impact 通常比 components 拆分大、但比 schema / paradigm 小。</p>
<h2 id="type-ftopology-re-layout結構-anatomy">Type F「Topology re-layout」結構 anatomy</h2>
<p>從 <a href="/blog/backend/02-cache-redis/vendors/redis/cluster-resharding/" data-link-title="Redis Cluster Re-sharding：source = target，但 topology 重劃的 5 段流程" data-link-desc="Redis cluster re-sharding 是 5 type migration 漏類實證 — source / target 同 cluster、無 schema / paradigm 差、但 16384 slot 重分配是核心；本文涵蓋 4 種 re-sharding driver、slot migration 機制、redis-cli --cluster rebalance / reshard 工具、5 個 production 踩雷（cluster busy / replica lag / client cache stale / cross-slot transaction / monitor gap）">Redis cluster re-sharding</a> 抽出的標準形態：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">1. 為什麼 re-layout（4-N 種 driver）
</span></span><span class="line"><span class="ln">2</span><span class="cl">2. 結構 differentiator（re-layout 不是 migration）
</span></span><span class="line"><span class="ln">3</span><span class="cl">3. Pre-layout analysis（current topology audit / hot key / slot 分佈）
</span></span><span class="line"><span class="ln">4</span><span class="cl">4. Re-layout 機制（slot migration / partition split / shard rebalance）
</span></span><span class="line"><span class="ln">5</span><span class="cl">5. Execution flow（per-step、含 rollback boundary）
</span></span><span class="line"><span class="ln">6</span><span class="cl">6. Production 故障演練
</span></span><span class="line"><span class="ln">7</span><span class="cl">7. Capacity / cost
</span></span><span class="line"><span class="ln">8</span><span class="cl">8. 整合 / 下一步</span></span></code></pre></div><p>7-9 章節、200-260 行。三個 <em>新元素</em> 是 Type F 的核心承擔：</p>
<ul>
<li><strong>Pre-layout analysis 段</strong>：在執行前列出當前 topology（slot 分佈 / hot key / replica lag / partition imbalance）、決定 <em>re-layout 的範圍跟順序</em>；缺這段、後續執行階段沒 baseline 可比、failure 偵測延遲</li>
<li><strong>Re-layout 機制段</strong>：解釋 vendor 的 <em>slot migration / partition split / shard rebalance</em> protocol —讀者要理解 vendor 內部機制才能預估 latency / locking / atomicity 邊界</li>
<li><strong>Execution flow per-step + rollback boundary</strong>：跟 Type A 的 phased 對照、Type F per-step 粒度更細（單 slot migration vs 整個 phase）、每 step 都要明示 <em>能否回退、回退時資料狀態</em></li>
</ul>
<p>跟 Type B 對照、Type F 多了「topology audit」段、Step-by-step 比 Type B 細（per-step 不是 per-cutover）；跟 Type A phased 對照、Type F 多數情境不需要 schema translation / parallel run / cleanup phase（source / target 同 cluster）；但 <em>multi-region rollout</em> 子情境例外、仍需 parallel run（兩 region 同跑後切流量）— 此時 Type F + Type A parallel run 段組合應用、見「多重歸類」規則。</p>
<p>注意 anatomy 列 8 row 是 <em>規範形態</em>、不是強制機械對映 — 實作上「結構 differentiator」+「pre-layout analysis」段可 inline 到開頭 audit 段（如 <a href="/blog/backend/02-cache-redis/vendors/redis/cluster-resharding/" data-link-title="Redis Cluster Re-sharding：source = target，但 topology 重劃的 5 段流程" data-link-desc="Redis cluster re-sharding 是 5 type migration 漏類實證 — source / target 同 cluster、無 schema / paradigm 差、但 16384 slot 重分配是核心；本文涵蓋 4 種 re-sharding driver、slot migration 機制、redis-cli --cluster rebalance / reshard 工具、5 個 production 踩雷（cluster busy / replica lag / client cache stale / cross-slot transaction / monitor gap）">Redis cluster re-sharding</a> 的「Source = Target，但 topology 重劃」段內聯處理）、實作 H2 數可能比 anatomy 列 row 少 1-2 個。</p>
<h2 id="production-反模式">Production 反模式</h2>
<table>
  <thead>
      <tr>
          <th>反模式</th>
          <th>後果</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>把 re-sharding 套 Type B drop-in</td>
          <td>漏掉 slot migration 機制段、cluster busy 跟 stale client cache 沒被處理</td>
      </tr>
      <tr>
          <td>把 multi-region rollout 套 Type C</td>
          <td>漏掉 locality-aware queries 跟 replication topology 設計</td>
      </tr>
      <tr>
          <td>Topology 變化只列在「容量」段</td>
          <td>讀者把 topology 當 capacity 子議題、忽略 <em>結構</em> 影響</td>
      </tr>
      <tr>
          <td>多 sub-dimension 同時變、只寫一個</td>
          <td>例：Cassandra 加 DC 同時改 replication factor、只寫前者</td>
      </tr>
      <tr>
          <td>Type F 套錯場景（topology 沒變的 migration）</td>
          <td>強迫 phased per-step、phase 空白</td>
      </tr>
  </tbody>
</table>
<h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係</h2>
<table>
  <thead>
      <tr>
          <th>原則</th>
          <th>關係</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="../content-structure-by-max-diff-dimension/">#127 Process content 結構由最大差異維度決定</a></td>
          <td>父卡 — 本卡擴 #127 的 audit 框架從 5 維到 6 維、新增 Type F；#127 的 5 type 仍適用、本卡加第 6 type</td>
      </tr>
      <tr>
          <td><a href="../collapse-is-implicit-default/">#125 Collapse 是隱形預設</a></td>
          <td>同骨 — 5 維 audit 漏 topology 是「結構分類 collapse 掉 topology 軸」、是 #125 在 audit dimension surface 的子實例</td>
      </tr>
      <tr>
          <td><a href="../standard-driven-vs-case-driven-domain-judgment/">#118 Standard-driven vs case-driven domain judgment</a></td>
          <td>Sibling — 兩卡都是 <em>寫作前的 domain audit</em>、#118 判 case-driven vs standard-driven、本卡判 topology 是否需要 Type F</td>
      </tr>
      <tr>
          <td><a href="../cadence-homogenization-in-batch-writing/">#122 Cadence 同質化是模板的隱形維度</a></td>
          <td>同骨 — 模板有「內容欄位 / cadence」兩維度（#122）vs audit 有「6 維 / topology」兩 layer；都是「初始框架漏軸、用實證浮現補位」</td>
      </tr>
  </tbody>
</table>
<h2 id="判讀徵兆">判讀徵兆</h2>
<table>
  <thead>
      <tr>
          <th>訊號</th>
          <th>該做的事</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>寫到一半發現 5 維 audit 都 Low、但內容跟 Type B drop-in 不一樣</td>
          <td>Topology 可能是漏掉的維度、補 6 維 audit</td>
      </tr>
      <tr>
          <td>「容量規劃」段比實作段還複雜</td>
          <td>Topology 變動被誤歸 capacity、應該獨立段</td>
      </tr>
      <tr>
          <td>Sharding / partition / region 任一變動</td>
          <td>跑 topology audit、評估是否 Type F</td>
      </tr>
      <tr>
          <td>同 vendor 內升級 / re-layout</td>
          <td>大概率不是 5 type、檢查 topology 是否變</td>
      </tr>
      <tr>
          <td>Type B 結構寫不下實際內容</td>
          <td>可能是 Type F 而非 Type B</td>
      </tr>
      <tr>
          <td>多個 sub-dimension 同時變</td>
          <td>Complex topology migration、結構複雜度 +1 階</td>
      </tr>
  </tbody>
</table>
<p><strong>核心</strong>：5 維 audit 漏 topology 是初始框架的盲點；topology 是 <em>資料分佈</em> 而非 <em>資料結構 / 元件 / 抽象</em>、需要獨立 audit 軸。Type F「Topology re-layout」對映 topology = High 的 process content、跟 Type A-E 並列；多軸 High 配對按 <a href="../content-structure-by-max-diff-dimension/">#127</a> 多重歸類規則處理。</p>
<hr>
<h2 id="self-aware-limitation本卡的-6-個未解結構性質疑">Self-aware limitation：本卡的 6 個未解結構性質疑</h2>
<p>第二輪 4-reviewer audit 揭露 6 項結構性 issue、本卡選擇 <em>meta-acknowledgment</em>（記錄）而非 <em>substantive restructure</em>（重寫）— 跟 <a href="../content-structure-by-max-diff-dimension/">#127 self-aware limitation</a> spirit 一致：</p>
<ol>
<li><strong>6 維仍可能漏類</strong>：reviewer 提 identity / authorization / consistency / transactional / data residency 三軸候選；本卡確認 <em>6 維是 current best understanding、不是窮盡</em>；下一輪 batch 跑前優先驗證這些候選軸是否真的獨立</li>
<li><strong>Type F 跟 Type B 結構重疊度高</strong>：anatomy 8 row 中 6 row 跟 Type B 對齊、實質差異在「pre-layout analysis + re-layout 機制」兩段；可能下次 evolution 是 <em>Type B 的 variant</em> 而非並列 type；保留現狀因為「同 cluster」邊界對讀者區分有用</li>
<li><strong>「不需要 parallel run」claim 部分不成立</strong>：multi-region rollout 子情境仍需 parallel run（兩 region 同跑然後切流量）— anatomy 已加註此例外、跟「多重歸類」規則組合應用</li>
<li><strong>主導維度優先序是 audience-dependent heuristic</strong>：DBA 視角 Topology 可能 &gt; Operational、application developer 視角 Schema &gt; Paradigm；當前 <code>Schema &gt; Paradigm &gt; Operational &gt; Topology &gt; Components</code> 預設是「跨 audience 平均」、非 universal；reviewer 識別此 stipulation 性質</li>
<li><strong>「topology 不能塞進既有 5 維」拒絕理由的窄定義依賴</strong>：4 個拒絕點都靠 narrow 既有 5 維定義成立；換個合理定義（如「component = 任何 cluster-internal primitive、包含 partition」）topology 跟 components 邊界會 collapse；保留現狀因為當前定義對寫作判讀有用</li>
<li><strong>既有 5 篇 playbook 沒 retroactive audit</strong>：6 維框架 retroactively 對既有 Type A-E 文章未重審；Splunk → Elastic / Datadog → Grafana / Postgres → Aurora 按 6 維可能變 multi-axis；這是已知 <em>silent grandfathering</em>、不是清白「擴張」</li>
</ol>
<p>下一輪 batch trigger：</p>
<ul>
<li>寫 1-2 篇 Type F dogfood 驗證 anatomy 通用性（Cassandra re-balance / PG partition redesign 是候選）</li>
<li>若浮現 <em>Type F 跟 Type B 結構真同構</em>、考慮降級為 variant</li>
<li>若浮現 <em>identity / consistency / residency 真的獨立軸</em>、再擴 audit 到 7 維</li>
<li>既有 5 篇 retroactive audit 在累積到 10+ migration playbook 後做、單獨成 retrospective report</li>
</ul>
<h3 id="update2026-05-19-第三輪-migration-batch-後4-條-tripwire-全驗證">Update（2026-05-19 第三輪 migration batch 後）：4 條 tripwire 全驗證</h3>
<p>第三輪 migration batch（5 篇）執行了上述 4 條 trigger、各自結果：</p>
<table>
  <thead>
      <tr>
          <th>Tripwire 預測</th>
          <th>第三輪結果</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Type F dogfood × 2 驗證 anatomy 通用性</td>
          <td><strong>完成</strong>：<a href="/blog/backend/01-database/vendors/postgresql/partition-redesign/" data-link-title="PostgreSQL Partition Redesign：當 monthly partition 越跑越慢" data-link-desc="PostgreSQL partition redesign 是 Type F「topology re-layout」第 2 個 dogfood — 從 monthly partition 改 daily / 從 range 改 list / 從單軸改 sub-partition；6 維 audit 皆 Low &#43; topology 軸 High；涵蓋 partition 不平衡偵測、ATTACH/DETACH 線上重劃、5 個 production 踩雷、跟 partition_pruning &#43; autovacuum 整合">PG partition redesign</a> + <a href="/blog/backend/01-database/vendors/mongodb/shard-expansion-multi-dc/" data-link-title="MongoDB Shard Expansion &#43; Multi-DC：Type F「不需要 parallel run」的 multi-region 例外" data-link-desc="MongoDB sharded cluster 加 shard &#43; 跨 DC expansion 是 Type F「topology re-layout」第 3 個 dogfood — 同時改 sharding &#43; replication topology &#43; region distribution；驗證 [#128](/report/data-topology-as-audit-dimension/) self-aware limitation 第 3 點「Type F 不需要 parallel run」claim 的例外（multi-region rollout 必須 parallel run &#43; 切流量）；涵蓋 chunk migration / replica set add member / cross-DC routing">MongoDB shard+multi-DC</a>；anatomy 在 PG / MongoDB 上仍適用、跟 Redis re-sharding 對齊</td>
      </tr>
      <tr>
          <td>Type F vs Type B 結構同構驗證</td>
          <td><strong>部分浮現</strong>：PG partition / Redis re-sharding 不需 parallel run、MongoDB multi-DC 需要；建議 Type F 拆 <em>F-cluster</em>（單 cluster 內、不需 parallel run）+ <em>F-multi-region</em>（跨 region、需 parallel run）兩 sub-type、未來累積更多 case 後 commit</td>
      </tr>
      <tr>
          <td>Identity / consistency / residency 三軸候選驗證</td>
          <td><strong>三軸各 1 case 驗證、工作量分佈支持獨立軸</strong>：<a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/migrate-to-aws-secrets-manager/" data-link-title="Vault → AWS Secrets Manager：「secret」不是「secret」、identity model 才是核心差異" data-link-desc="Vault → AWS Secrets Manager migration 表面是 secret store 替換、實際核心是 identity model 對位（Vault token &#43; policy vs AWS IAM &#43; resource policy）；驗證 [#128](/report/data-topology-as-audit-dimension/) self-aware limitation 提出的 identity axis 候選 — identity 是否獨立 audit 軸；5 個 production 踩雷（IAM principal 對位 / dynamic credential 對等失敗 / lease lifecycle 模型不同 / audit log 結構差 / 計費模型反轉）">Vault → AWS Secrets Manager</a>（identity、45% 工作量）/ <a href="/blog/backend/01-database/vendors/dynamodb/consistency-model-optimization/" data-link-title="DynamoDB Strongly Consistent → Eventually Consistent：same protocol, different contract" data-link-desc="DynamoDB consistency model 從 strongly consistent read 改 eventually consistent read 是 50% cost 優化但風險集中在 application contract — 同 vendor / 同 protocol / 同 table / 不同 read consistency；驗證 [#128](/report/data-topology-as-audit-dimension/) self-aware limitation 提出的 consistency axis 候選；涵蓋 read pattern audit / 5 個 production 踩雷">DynamoDB consistency</a>（consistency、85% 工作量）/ <a href="/blog/backend/01-database/vendors/postgresql/multi-region-gdpr-rollout/" data-link-title="PostgreSQL Multi-Region GDPR Rollout：政策驅動的 migration 屬本 methodology 嗎" data-link-desc="PostgreSQL 單 region → multi-region 同時滿足 GDPR EU residency 是 *政策驅動* 兼 *topology 變動* 兼 *operational redesign* 的多軸 migration；驗證 [#128](/report/data-topology-as-audit-dimension/) self-aware limitation 提出的 residency axis 候選 — residency 是 driver 還是獨立 audit 軸；涵蓋 logical replication 配 GDPR / 5 個 production 踩雷 / cross-region cost">PG GDPR multi-region</a>（residency、40% 工作量）；累積到 3-5 case / 軸後 commit 升 7-9 維 audit</td>
      </tr>
      <tr>
          <td>既有 5 篇 retroactive audit</td>
          <td>暫不執行、累積到 10+ migration playbook 後再做（當前共 10 篇 migration、剛達 trigger threshold、留下輪 retrospective 處理）</td>
      </tr>
  </tbody>
</table>
<p>3 軸候選驗證 detail：</p>
<ul>
<li><strong>Identity axis</strong>：Vault → AWS Secrets Manager 45% 工作量在 identity model 對位（Vault token vs IAM principal）、不歸 schema / operational / application change；驗證 identity 可獨立發生 + 帶獨立工作量</li>
<li><strong>Consistency axis</strong>：DynamoDB strong → eventual 85% 工作量在 per-call-site contract review、不歸 paradigm / application change；驗證 consistency 可獨立發生 + 帶獨立工作量</li>
<li><strong>Residency axis</strong>：GDPR multi-region 40% 工作量在 compliance（DPIA / evidence collection / DPO sign-off）、reverse-constrain topology + operational + application；驗證 residency 不只是 driver、是 cross-cutting constraint</li>
</ul>
<p>新浮現議題（不在原 tripwire 內）：</p>
<ul>
<li><strong>Residency 是 cross-cutting constraint vs 獨立軸</strong>：reviewer 把 residency 歸為 driver、實證上是 <em>cross-cutting constraint</em> — 反向約束其他維度 + 帶獨立合規工作量；可能需要 <em>constraint layer</em> 概念跟 axis 並列</li>
<li><strong>Type F sub-type 浮現</strong>：multi-region rollout 跟 cluster re-sharding 是不同 sub-type；前者需 parallel run、後者不需；anatomy 在 sub-type 之間有差異</li>
</ul>
]]></content:encoded></item></channel></rss>