<?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>Nosql on Tarragon</title><link>https://tarrragon.github.io/blog/tags/nosql/</link><description>Recent content in Nosql on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Wed, 27 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/nosql/index.xml" rel="self" type="application/rss+xml"/><item><title>DB3 Vendor Selection：document / KV / multi-model 三方選型 + workload shape 前置判讀</title><link>https://tarrragon.github.io/blog/backend/01-database/vendors/db3-vendor-selection/</link><pubDate>Wed, 27 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/01-database/vendors/db3-vendor-selection/</guid><description>&lt;p>DB3 vendor selection 的核心責任是把讀者從「我該選 MongoDB / DynamoDB / Cosmos DB 哪一家」這個問題、推到「我的 workload 是 document / KV / multi-model 哪一類」這個更前置的問題。三家文件都標榜 scalable schema-less、但實際取捨在 &lt;em>資料形狀、access pattern 穩定度、consistency 可接受度&lt;/em> 三軸決定 — 不識別 workload shape 直接比 vendor 是源頭錯誤。本文是 DB3 reader 進來的第一站：先做 workload shape 三軸前置判讀、再過 migration path 三型 + federated DB 視角、最後落到三 vendor 對比 10 軸。&lt;/p>
&lt;p>本文 &lt;em>不&lt;/em> 展開 vendor 機制細節（partition key 設計 / consistency level / RU sizing / connection management 等）— 那些屬 per-vendor deep article 的責任、本文在每個軸後 cross-link 過去。本文也 &lt;em>不&lt;/em> 比較三家「誰比較強」— 三 vendor 在 workload-by-workload 適配光譜上各有位置、寫成優劣比較會誤導讀者把選型壓成單軸。&lt;/p>
&lt;h2 id="問題情境讀者進來時的真實壓力">問題情境：讀者進來時的真實壓力&lt;/h2>
&lt;p>典型啟動壓力分兩類：&lt;/p>
&lt;p>第一類、團隊評估 document / KV / multi-model NoSQL 三家、文件都說「scalable schema-less」、看不出實際取捨。讀者徵兆是「我的資料是 document-shaped 還是 KV-shaped？」「partition key 該怎麼選？」「Atlas 跟 Cosmos DB MongoDB API 不一樣的點在哪？」「Cosmos DB multi-model 是真用得到還是行銷話術？」「on-demand vs provisioned 怎麼選？」&lt;/p>
&lt;p>第二類、既有 PostgreSQL / MySQL workload 撞 connection limit（surge 下 1K-5K pool 是隱性天花板、F1.7）、想換 KV 但不知道是否適合。讀者徵兆是「我已經有 Memcached、還要再加 MongoDB cache 層嗎？」「DynamoDB 適合當 OLTP 嗎？」「換 NoSQL 是不是解 connection 問題的銀彈？」&lt;/p>
&lt;p>這兩類讀者進來時的 &lt;em>真實問題&lt;/em> 不在 vendor 之間、在 &lt;em>workload 自己屬哪一型&lt;/em>。Case anchor 覆蓋六個 unique 角度：&lt;/p>
&lt;ul>
&lt;li>多型 document workload — &lt;a href="https://tarrragon.github.io/blog/backend/09-performance-capacity/cases/toyota-connected-mongodb-telematics-iot/" data-link-title="9.C38 Toyota Connected：MongoDB Atlas 撐 900 萬車輛 telematics、月 180 億 transaction" data-link-desc="Toyota Connected 用 MongoDB Atlas 撐 Safety Connect 900 萬車、月 180 億 transaction、緊急訊號 3 秒內到 agent">9.C38 Toyota Connected&lt;/a>（車載 sensor schema 隨車型演進、20 個 Atlas DB blast radius 切分）&lt;/li>
&lt;li>Document 跨雲 hedging — &lt;a href="https://tarrragon.github.io/blog/backend/09-performance-capacity/cases/forbes-mongodb-atlas-multi-cloud-migration/" data-link-title="9.C37 Forbes：自管 MongoDB → Atlas on GCP、build 時間 25 → 9 分鐘" data-link-desc="Forbes 把自管 MongoDB 遷到 Atlas on Google Cloud、6 個月完成、build 25 → 9 分鐘、120M 不重複訪客單月承接">9.C37 Forbes&lt;/a>（自管 → Atlas、6 個月遷移、跨雲彈性）&lt;/li>
&lt;li>同 model 換 vendor 的 dogfood signal — &lt;a href="https://tarrragon.github.io/blog/backend/09-performance-capacity/cases/microsoft-365-cosmos-db-analytics/" data-link-title="9.C30 Microsoft 365：從 MongoDB 遷移到 Cosmos DB 的分析平台" data-link-desc="Microsoft 365 把使用分析平台從 MongoDB 遷移到 Cosmos DB、planet-scale 全球分散式分析">9.C30 Microsoft 365&lt;/a>（MongoDB → Cosmos DB MongoDB API、保留 driver、wire compat 限制）&lt;/li>
&lt;li>KV-as-buffer 正向用例 — &lt;a href="https://tarrragon.github.io/blog/backend/09-performance-capacity/cases/tixcraft-ticketing-flash-sale-spike/" data-link-title="9.C15 拓元 Tixcraft：售票搶購的瞬間爆量架構" data-link-desc="拓元用 DynamoDB 當寫入緩衝 &amp;#43; 傳統伺服器當慢速消費者、承受 100K&amp;#43; 同時選位 &amp;#43; 30 秒從 6 台擴到 800 台">9.C15 Tixcraft&lt;/a>（DynamoDB 寫入緩衝、6750x 彈性、後端慢消費）&lt;/li>
&lt;li>PK 天然均勻典範 — &lt;a href="https://tarrragon.github.io/blog/backend/09-performance-capacity/cases/amazon-ads-dynamodb-extreme-kv/" data-link-title="9.C5 Amazon Ads：DynamoDB 9000 萬 reads/sec 的廣告事件量測" data-link-desc="Amazon Ads 在 DynamoDB 上跑 9000 萬 reads/sec &amp;#43; 500 萬 writes/sec、99.999% 可用性的廣告事件量測">9.C5 Amazon Ads&lt;/a>（90M reads/sec 年度峰值、KV pattern 純粹）&lt;/li>
&lt;li>Federated DB 真實系統 — &lt;a href="https://tarrragon.github.io/blog/backend/09-performance-capacity/cases/coinbase-mongodb-document-platform/" data-link-title="9.C36 Coinbase：MongoDB 撐 Ruby 單體 &amp;#43; 1.5M reads/sec identity 服務" data-link-desc="Coinbase 以 MongoDB 為主資料層、自建 mongobetween connection proxy、users 服務在加密貨幣 surge 時撐 1.5M reads/sec">9.C36 Coinbase&lt;/a>（MongoDB + DynamoDB + Memcached + mongobetween + freshness token）&lt;/li>
&lt;/ul>
&lt;h2 id="workload-shape--access-pattern--consistency-三軸前置判讀">Workload shape × access pattern × consistency 三軸前置判讀&lt;/h2>
&lt;p>進三家 vendor 對比前先回答：你的 workload 屬哪一型？三軸的組合決定 vendor 候選清單、軸不識別清楚直接比 vendor 是把選型壓成「品牌偏好」、不是工程決策。&lt;/p></description><content:encoded><![CDATA[<p>DB3 vendor selection 的核心責任是把讀者從「我該選 MongoDB / DynamoDB / Cosmos DB 哪一家」這個問題、推到「我的 workload 是 document / KV / multi-model 哪一類」這個更前置的問題。三家文件都標榜 scalable schema-less、但實際取捨在 <em>資料形狀、access pattern 穩定度、consistency 可接受度</em> 三軸決定 — 不識別 workload shape 直接比 vendor 是源頭錯誤。本文是 DB3 reader 進來的第一站：先做 workload shape 三軸前置判讀、再過 migration path 三型 + federated DB 視角、最後落到三 vendor 對比 10 軸。</p>
<p>本文 <em>不</em> 展開 vendor 機制細節（partition key 設計 / consistency level / RU sizing / connection management 等）— 那些屬 per-vendor deep article 的責任、本文在每個軸後 cross-link 過去。本文也 <em>不</em> 比較三家「誰比較強」— 三 vendor 在 workload-by-workload 適配光譜上各有位置、寫成優劣比較會誤導讀者把選型壓成單軸。</p>
<h2 id="問題情境讀者進來時的真實壓力">問題情境：讀者進來時的真實壓力</h2>
<p>典型啟動壓力分兩類：</p>
<p>第一類、團隊評估 document / KV / multi-model NoSQL 三家、文件都說「scalable schema-less」、看不出實際取捨。讀者徵兆是「我的資料是 document-shaped 還是 KV-shaped？」「partition key 該怎麼選？」「Atlas 跟 Cosmos DB MongoDB API 不一樣的點在哪？」「Cosmos DB multi-model 是真用得到還是行銷話術？」「on-demand vs provisioned 怎麼選？」</p>
<p>第二類、既有 PostgreSQL / MySQL workload 撞 connection limit（surge 下 1K-5K pool 是隱性天花板、F1.7）、想換 KV 但不知道是否適合。讀者徵兆是「我已經有 Memcached、還要再加 MongoDB cache 層嗎？」「DynamoDB 適合當 OLTP 嗎？」「換 NoSQL 是不是解 connection 問題的銀彈？」</p>
<p>這兩類讀者進來時的 <em>真實問題</em> 不在 vendor 之間、在 <em>workload 自己屬哪一型</em>。Case anchor 覆蓋六個 unique 角度：</p>
<ul>
<li>多型 document workload — <a href="/blog/backend/09-performance-capacity/cases/toyota-connected-mongodb-telematics-iot/" data-link-title="9.C38 Toyota Connected：MongoDB Atlas 撐 900 萬車輛 telematics、月 180 億 transaction" data-link-desc="Toyota Connected 用 MongoDB Atlas 撐 Safety Connect 900 萬車、月 180 億 transaction、緊急訊號 3 秒內到 agent">9.C38 Toyota Connected</a>（車載 sensor schema 隨車型演進、20 個 Atlas DB blast radius 切分）</li>
<li>Document 跨雲 hedging — <a href="/blog/backend/09-performance-capacity/cases/forbes-mongodb-atlas-multi-cloud-migration/" data-link-title="9.C37 Forbes：自管 MongoDB → Atlas on GCP、build 時間 25 → 9 分鐘" data-link-desc="Forbes 把自管 MongoDB 遷到 Atlas on Google Cloud、6 個月完成、build 25 → 9 分鐘、120M 不重複訪客單月承接">9.C37 Forbes</a>（自管 → Atlas、6 個月遷移、跨雲彈性）</li>
<li>同 model 換 vendor 的 dogfood signal — <a href="/blog/backend/09-performance-capacity/cases/microsoft-365-cosmos-db-analytics/" data-link-title="9.C30 Microsoft 365：從 MongoDB 遷移到 Cosmos DB 的分析平台" data-link-desc="Microsoft 365 把使用分析平台從 MongoDB 遷移到 Cosmos DB、planet-scale 全球分散式分析">9.C30 Microsoft 365</a>（MongoDB → Cosmos DB MongoDB API、保留 driver、wire compat 限制）</li>
<li>KV-as-buffer 正向用例 — <a href="/blog/backend/09-performance-capacity/cases/tixcraft-ticketing-flash-sale-spike/" data-link-title="9.C15 拓元 Tixcraft：售票搶購的瞬間爆量架構" data-link-desc="拓元用 DynamoDB 當寫入緩衝 &#43; 傳統伺服器當慢速消費者、承受 100K&#43; 同時選位 &#43; 30 秒從 6 台擴到 800 台">9.C15 Tixcraft</a>（DynamoDB 寫入緩衝、6750x 彈性、後端慢消費）</li>
<li>PK 天然均勻典範 — <a href="/blog/backend/09-performance-capacity/cases/amazon-ads-dynamodb-extreme-kv/" data-link-title="9.C5 Amazon Ads：DynamoDB 9000 萬 reads/sec 的廣告事件量測" data-link-desc="Amazon Ads 在 DynamoDB 上跑 9000 萬 reads/sec &#43; 500 萬 writes/sec、99.999% 可用性的廣告事件量測">9.C5 Amazon Ads</a>（90M reads/sec 年度峰值、KV pattern 純粹）</li>
<li>Federated DB 真實系統 — <a href="/blog/backend/09-performance-capacity/cases/coinbase-mongodb-document-platform/" data-link-title="9.C36 Coinbase：MongoDB 撐 Ruby 單體 &#43; 1.5M reads/sec identity 服務" data-link-desc="Coinbase 以 MongoDB 為主資料層、自建 mongobetween connection proxy、users 服務在加密貨幣 surge 時撐 1.5M reads/sec">9.C36 Coinbase</a>（MongoDB + DynamoDB + Memcached + mongobetween + freshness token）</li>
</ul>
<h2 id="workload-shape--access-pattern--consistency-三軸前置判讀">Workload shape × access pattern × consistency 三軸前置判讀</h2>
<p>進三家 vendor 對比前先回答：你的 workload 屬哪一型？三軸的組合決定 vendor 候選清單、軸不識別清楚直接比 vendor 是把選型壓成「品牌偏好」、不是工程決策。</p>
<h3 id="軸-1--資料形狀document--kv--不清楚">軸 1 — 資料形狀：document / KV / 不清楚</h3>
<p>資料形狀的核心判讀是 <em>aggregate root 邊界是否明確</em> 跟 <em>schema 是否會隨產品演進新增欄位</em>。document 適合的場景是資料天然多型、單筆記錄欄位差異大、應用層用 aggregate root 模式存取；KV 適合的場景是資料形狀固定、access pattern 數量少（&lt; 5 種）、固定 lookup by key。</p>
<table>
  <thead>
      <tr>
          <th>訊號</th>
          <th>適配資料模型</th>
          <th>對應 case</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>資料天然多型（不同記錄欄位不同）、隨產品演進 schema 增刪欄位、aggregate root 邊界明確</td>
          <td>Document（MongoDB / Cosmos DB SQL API / MongoDB API）</td>
          <td>Toyota sensor schema 隨車型演進、Forbes CMS article 欄位多型</td>
      </tr>
      <tr>
          <td>資料形狀固定、access pattern &lt; 5 種、固定 lookup by key（meeting_id / message_id / user_id）</td>
          <td>KV（DynamoDB / Cosmos DB Table API / Redis 持久化變體）</td>
          <td>Amazon Ads 用 ad_id 查、Disney+ 用 user_id 查 watchlist、PayPay 用 message_id 查通知</td>
      </tr>
      <tr>
          <td>資料形狀還在探索、access pattern 變動頻繁、未來 6 個月會加 5+ 種新 query</td>
          <td>暫緩 NoSQL 選型、用 PostgreSQL + JSONB 過渡</td>
          <td>屬讀者誤判常見模式、case 沒揭露但 F1.3 / F1.6 推論：NoSQL 假設 access pattern 穩定、未穩定就上 NoSQL 會撞 single-table 設計天花板</td>
      </tr>
  </tbody>
</table>
<p>第三列的「暫緩 NoSQL」是反指標。NoSQL（特別是 DynamoDB single-table design）的核心假設是「access pattern 在設計時已知、後續變動有限」。資料模型還在探索、access pattern 半年內會大幅增減的場景、PostgreSQL + JSONB 給的彈性遠高於 NoSQL — JSONB 欄位可以演進、ad-hoc query 可以用 SQL 跑、未來釐清穩定 access pattern 後再選 NoSQL 不遲。</p>
<h3 id="軸-2--access-pattern-穩定度kv-適用度前置判讀">軸 2 — Access pattern 穩定度（KV 適用度前置判讀）</h3>
<p>KV 適用度的核心判讀是 <em>partition key 天然均勻度</em>。partition key 不均勻會讓 vendor 廣告的「scale infinitely」變成「scale 到 hot partition 為止」、單一 logical key 流量超過該 partition 上限就 throttle 或 latency spike（F1.1）。</p>
<ul>
<li><strong>天然均勻 PK + 穩定 access pattern</strong>（meeting_id / player_id / message_id / user_id）→ DynamoDB / Cosmos DB Table API 適用、PK 不需 composite key 修補。Amazon Ads 用 ad_id 撐 90M reads/sec、Zoom 用 meeting_id、Capcom 用 player_id、PayPay 用 message_id、Disney+ 用 user_id — 五個 case 都揭露同一 frame：<em>業務天然存在均勻 key 時 KV 是最自然的選擇</em>。</li>
<li><strong>天然不均勻 PK</strong>（event_id 一場演唱會集中 / date 時間序集中）→ 需 composite key 或 write sharding 修補。Tixcraft（9.C15）用 <code>event_id + user_id_hash</code> composite key 把單一熱門演唱會的 6750x spike 攤平到 partition 上 — 不是 DynamoDB 自身彈性、是 partition key 均勻分散的結果（F1.2）。</li>
<li><strong>Access pattern 變動頻繁</strong>（探索期、&lt; 5 種 query 還會增加）→ 不適合 DynamoDB single-table design、回 RDB。Single-table 把 access pattern 編進 PK / SK 結構、增加新 query 等於改 schema、改 schema 等於重新 load 資料、成本不對。</li>
</ul>
<p>KV 適用度判讀的延伸細節（hot partition 反模式 / composite key 設計 / adaptive capacity）見 <a href="/blog/backend/01-database/vendors/dynamodb/partition-key-antipatterns/" data-link-title="DynamoDB Partition Key 反模式與 Write Sharding：composite key 修復跟 mode × partition 交叉判讀" data-link-desc="DynamoDB partition 上限 1000 WCU 是 hot partition 的根因；composite key（event_id &#43; shard suffix）跟 calculated shard（hash % N）兩種修法、mode × partition 在 provisioned / on-demand 不同表現，以及 9.C15 Tixcraft 6750x 擴展的工程細節">DynamoDB partition key antipatterns</a>。</p>
<h3 id="軸-3--consistency-需求是否可接受-eventual">軸 3 — Consistency 需求是否可接受 eventual</h3>
<p>Consistency 需求的核心判讀是 <em>跨 partition / 跨 region transaction 是否為產品契約</em>。三家 vendor 都支援單 partition / 單 region 強一致、但 cross-partition / cross-region transaction 的機制跟限制差異大。</p>
<ul>
<li><strong>可接受 eventual / session consistency</strong>：DynamoDB（default eventually consistent reads、可選 strong）、Cosmos DB（5 個 consistency level、default session）、MongoDB（read concern 多級）— 三家都可以、選擇看其他軸。多數 KV / document workload 屬此類（social timeline、watchlist、message queue、analytics aggregation）。</li>
<li><strong>需要強一致 cross-partition transaction</strong>：DynamoDB 跨 partition transaction 限制（單一 transaction 最多 100 個 action、跨 region 不支援）、MongoDB 4.0+ 支援 multi-document transaction 但 sharded cluster 仍有 limitation、Cosmos DB 跨 logical partition transaction 受限 — 都不如 SQL／distributed SQL 自然、應回 DB4 entry point 評估 <a href="/blog/backend/01-database/vendors/cockroachdb/aurora-dsql-spanner-decision-tree/" data-link-title="CockroachDB vs Aurora DSQL vs Spanner：撞牆訊號分型 &#43; 七問題決策樹" data-link-desc="Distributed SQL 三選一決策樹。先用撞牆訊號分型識別 driver path（DoorDash 單主寫入撞牆 / Netflix Cassandra 缺口 / Hard Rock 合規驅動）、再走七問題（跨雲 / 雲商生態 / 風險預算 / PG 相容 / 管理負擔 / team size / vendor sizing barrier）。PostgreSQL 相容性 audit checklist 4 項、Spanner 100 pu sizing barrier、Hard Rock 「省 10-20 工程師」機會成本警示、Netflix Database Platform Team 規模">Aurora DSQL / Spanner / CockroachDB</a>。</li>
<li><strong>跨 region active-active write</strong>：三家機制完全不同 — Cosmos DB multi-region write 跟 Strong consistency 是 <em>互斥</em> 設定（CAP 取捨硬約束、見 <a href="/blog/backend/01-database/vendors/cosmosdb/multi-region-write-conflict/" data-link-title="Cosmos DB Multi-Region Write：active-active、LWW、custom merge、Strong &#43; multi-region 互斥的 AP 取捨" data-link-desc="Multi-region active-active write 的 conflict resolution（LWW / custom merge / conflict feed）、Strong 跟 multi-region write 為什麼互斥、廣告 SLA vs 實測可用性鏈路拆解 — 從 Minecraft Earth &#43; Toyota Connected 切入">Cosmos DB multi-region write conflict</a> SSoT 主寫位置）；DynamoDB Global Tables 走 LWW（last-writer-wins）conflict resolution；MongoDB Atlas 跨 region 需手動 conflict 處理。三家不在同一光譜、選擇前必看各 vendor outline 的機制段。</li>
</ul>
<h2 id="migration-path-三型跨-case-合成-frame">Migration path 三型（跨 case 合成 frame）</h2>
<blockquote>
<p>本段是 <em>跨 case 合成 frame</em>、不是單一 case 揭露 — 從 Coinbase（9.C36）/ Forbes（9.C37）/ Microsoft 365（9.C30）三 case 萃取的共通結構（F2.1）。</p></blockquote>
<p>讀者進來時通常不是綠地、是 <em>既有系統演進</em>。三型遷移路徑的風險、ROI、適用條件完全不同、選錯路徑會推到錯的 vendor。</p>
<h3 id="第一型保留原-db--補周邊工具">第一型：保留原 DB + 補周邊工具</h3>
<p>不換 vendor、加 connection proxy（mongobetween / pgbouncer 類）、加 cache（Memcached + freshness token）、加 predictive scaling — 主資料層不動、應用層跟 ops 層補強。</p>
<ul>
<li><strong>代表 case</strong>：Coinbase（9.C36）保留 MongoDB Atlas、自建 mongobetween 把 60K connections/min 降到 ~2K（一個量級）、用 Memcached + freshness token 撐 1.5M reads/sec、用 ML predictive scaling 把擴容時間從 70 → 25 分鐘提前 60 分鐘</li>
<li><strong>路徑成本</strong>：中（自建工具、需要工程資源 build &amp; operate proxy / cache layer / ML model）</li>
<li><strong>風險</strong>：低（主資料層不動、回滾代價小）</li>
<li><strong>ROI</strong>：保留主資料 schema + access pattern、解 driver / 部署模型 / cache 一致性瓶頸</li>
<li><strong>適合</strong>：MongoDB（或主 DB）資料層撐得住、但應用層 connection storm / cache miss / 擴容慢卡瓶頸；團隊有工程能力 build 跟 maintain 周邊工具</li>
</ul>
<p>延伸實作細節見 MongoDB connection management（per-vendor article、cross-link 待寫稿）。</p>
<h3 id="第二型同-db-換託管">第二型：同 DB 換託管</h3>
<p>自管 → managed（Atlas / Cosmos DB / DocumentDB）、保留 schema 跟 access pattern、遷移期 6 個月量級。</p>
<ul>
<li><strong>代表 case</strong>：Forbes（9.C37）自管 MongoDB → MongoDB Atlas、保留 CMS schema、6 個月遷移、揭露「TCO 改善 25%」</li>
<li><strong>路徑成本</strong>：中（dual-write + shadow read 驗證、driver 行為差異、operation runbook 重寫）</li>
<li><strong>風險</strong>：中（dual-write 期間雙寫一致性、cutover 時點選擇）</li>
<li><strong>ROI</strong>：operation transfer（DBA bandwidth 釋放給 schema design / query tuning）+ TCO 改善</li>
<li><strong>適合</strong>：自管 ops burden 大（DBA bandwidth 被 backup / patching / replica lag 吃光）、不想換 model</li>
</ul>
<p><strong>Scope warning（Forbes 25% TCO）</strong>：「25% TCO 改善」是 Forbes 特定流量規模（120M MAU、70+ Atlas region）下的數字、<em>不普適</em>。引用要帶條件 — 不要寫成「Atlas 比自管便宜 25%」這種 vendor-neutral 結論。實際省多少要看自管當下的 license / hardware / ops 工時分配、跟 Atlas 在你流量規模下的 pricing tier。</p>
<h3 id="第三型換-vendor-保留-model">第三型：換 vendor 保留 model</h3>
<p>MongoDB → Cosmos DB MongoDB API、或 MongoDB → DocumentDB — wire protocol + driver 不變、底層架構整個換、ops 模型整個換。</p>
<ul>
<li><strong>代表 case</strong>：Microsoft 365（9.C30）MongoDB → Cosmos DB MongoDB API、保留 MongoDB driver</li>
<li><strong>路徑成本</strong>：高（dual-write per query pattern 驗證、wire compat ≠ 100% 行為相同、aggregation pipeline 跟 transaction 行為要逐項驗證）</li>
<li><strong>風險</strong>：高（每個 query pattern 都可能踩到不相容 edge case、cutover 點選擇難）</li>
<li><strong>ROI</strong>：跨 vendor 換（Azure 生態 / multi-model API / global distribution）+ 保留應用層 driver code</li>
</ul>
<p><strong>Scope warning（Microsoft 365 dogfood）</strong>：Microsoft 365 是 Microsoft 自家 dogfood、case 沒揭露具體 throughput / latency / cost 數字（F2.17）。dogfood 是 <em>高權重 selection signal</em>（雲商賭自家旗艦產品）、但 <em>不是 production benchmark</em>（沒公開數字可比對）。引用要明示「dogfood signal」而非「production proof」。</p>
<p><strong>Scope warning（100% wire compat）</strong>：Cosmos DB MongoDB API 廣告「100% wire compatibility」是 <em>vendor 行銷話術</em>、實際是「在某些 query pattern 下相容」（F2.9）。遷移時必須 <em>dual-write per query pattern</em> 驗證 — 不是看 vendor 文件 spec list、是用 production query corpus 跑一遍實測行為。Phase 0 audit checklist 應列出 unsupported aggregation stage、transaction edge case、index behavior 差異、change stream 跟 Change Feed 對應關係。</p>
<p>延伸 Cosmos DB MongoDB API vs SQL API 選型見 <a href="/blog/backend/01-database/vendors/cosmosdb/mongodb-api-vs-sql-api/" data-link-title="Cosmos DB MongoDB API vs SQL API：遷移路徑、dogfood signal、multi-model、跨雲 hedging" data-link-desc="從『MongoDB API 跟 SQL API 哪個快』推進到 vendor selection 的四層問題：三型遷移路徑、dogfood signal 怎麼讀、multi-model 差異化、跨雲 hedging — 從 Microsoft 365 dogfood 案例切入">Cosmos DB MongoDB API vs SQL API</a>。</p>
<h3 id="第四型不在-db3-範圍paradigm-shift-換引擎">第四型不在 DB3 範圍：paradigm shift 換引擎</h3>
<p>KV → SQL 或 SQL → distributed SQL 屬 paradigm shift、應進 <a href="/blog/backend/01-database/vendors/cockroachdb/aurora-dsql-spanner-decision-tree/" data-link-title="CockroachDB vs Aurora DSQL vs Spanner：撞牆訊號分型 &#43; 七問題決策樹" data-link-desc="Distributed SQL 三選一決策樹。先用撞牆訊號分型識別 driver path（DoorDash 單主寫入撞牆 / Netflix Cassandra 缺口 / Hard Rock 合規驅動）、再走七問題（跨雲 / 雲商生態 / 風險預算 / PG 相容 / 管理負擔 / team size / vendor sizing barrier）。PostgreSQL 相容性 audit checklist 4 項、Spanner 100 pu sizing barrier、Hard Rock 「省 10-20 工程師」機會成本警示、Netflix Database Platform Team 規模">DB4 entry point: Aurora DSQL / Spanner / CockroachDB decision tree</a>。本文範圍是 DB3 三家內部選型、不展開 paradigm shift。</p>
<h2 id="從-rdb-撞牆來的快速路徑">從 RDB 撞牆來的快速路徑</h2>
<p>讀者若從 PostgreSQL / Aurora connection limit 撞牆過來、想評估 KV 替代、依撞牆訊號直接 route 到對應 article、不必先跑完三軸前置判讀：</p>
<ul>
<li><strong>撞 connection limit</strong>（surge 下 pool 1K-5K 隱性天花板、long-lived TCP 占滿）→ HTTP API 模型（no long-lived connection）的 KV 直接接寫入緩衝、進 <a href="/blog/backend/01-database/vendors/dynamodb/single-table-design-pattern/" data-link-title="DynamoDB Single-Table Design：從適用度前置判讀到 access pattern 反推 PK/SK" data-link-desc="DynamoDB single-table 設計不是「資料表越少越好」，而是 access pattern 反推 PK/SK 跟 GSI；本文先做 DynamoDB 適用度 4 軸前置判讀（PK 天然均勻 / control plane vs data plane / consistency / access pattern 穩定），再展開設計流程、failure modes 與 durable queue 正向用例">dynamodb/single-table-design-pattern</a> 的「durable queue / write buffer」段（Tixcraft 9.C15 路徑：DynamoDB 接訂單、傳統 server 慢消費）、或評估 <a href="/blog/backend/01-database/vendors/cosmosdb/mongodb-api-vs-sql-api/" data-link-title="Cosmos DB MongoDB API vs SQL API：遷移路徑、dogfood signal、multi-model、跨雲 hedging" data-link-desc="從『MongoDB API 跟 SQL API 哪個快』推進到 vendor selection 的四層問題：三型遷移路徑、dogfood signal 怎麼讀、multi-model 差異化、跨雲 hedging — 從 Microsoft 365 dogfood 案例切入">Cosmos DB Table API</a></li>
<li><strong>撞單 primary 寫入上限</strong>（單 leader 寫吞吐天花板、read replica 無法分擔寫）→ multi-primary distributed SQL 路徑、進 <a href="/blog/backend/01-database/vendors/cockroachdb/aurora-dsql-spanner-decision-tree/" data-link-title="CockroachDB vs Aurora DSQL vs Spanner：撞牆訊號分型 &#43; 七問題決策樹" data-link-desc="Distributed SQL 三選一決策樹。先用撞牆訊號分型識別 driver path（DoorDash 單主寫入撞牆 / Netflix Cassandra 缺口 / Hard Rock 合規驅動）、再走七問題（跨雲 / 雲商生態 / 風險預算 / PG 相容 / 管理負擔 / team size / vendor sizing barrier）。PostgreSQL 相容性 audit checklist 4 項、Spanner 100 pu sizing barrier、Hard Rock 「省 10-20 工程師」機會成本警示、Netflix Database Platform Team 規模">DB4 entry point: Aurora DSQL / Spanner / CockroachDB decision tree</a> 的 Path A（DoorDash 1.636 M QPS 單主寫入撞牆）</li>
<li><strong>撞單一 DB 撐不下 + 多 workload 形狀並存</strong>（read-heavy / write-heavy / analytics 混在一個 DB）→ federated DB 模式、看 <a href="/blog/backend/09-performance-capacity/cases/coinbase-mongodb-document-platform/" data-link-title="9.C36 Coinbase：MongoDB 撐 Ruby 單體 &#43; 1.5M reads/sec identity 服務" data-link-desc="Coinbase 以 MongoDB 為主資料層、自建 mongobetween connection proxy、users 服務在加密貨幣 surge 時撐 1.5M reads/sec">9.C36 Coinbase</a>（MongoDB + DynamoDB + Memcached + mongobetween）+ <a href="/blog/backend/09-performance-capacity/cases/ntt-docomo-lemino-japanese-streaming/" data-link-title="9.C29 NTT DOCOMO Lemino：3 個月達 500 萬 MAU 的串流後端" data-link-desc="Lemino 用 DynamoDB &#43; AWS Media Services 撐 30 channels live &#43; 5M MAU、工程工時下降 90%">9.C29 Lemino</a>（PostgreSQL → DynamoDB 揭露 RDB connection limit 隱性 bottleneck）</li>
</ul>
<p>進 <a href="/blog/backend/01-database/vendors/dynamodb/single-table-design-pattern/" data-link-title="DynamoDB Single-Table Design：從適用度前置判讀到 access pattern 反推 PK/SK" data-link-desc="DynamoDB single-table 設計不是「資料表越少越好」，而是 access pattern 反推 PK/SK 跟 GSI；本文先做 DynamoDB 適用度 4 軸前置判讀（PK 天然均勻 / control plane vs data plane / consistency / access pattern 穩定），再展開設計流程、failure modes 與 durable queue 正向用例">dynamodb/single-table-design-pattern</a> 前先確認軸 1 / 軸 2 的 access pattern 穩定度跟 PK 天然均勻度 — connection limit 訊號 <em>必要但不充分</em>、KV 適用度 4 軸還是要走完、避免「為了解 connection 把不穩定 access pattern 硬塞 single-table」反模式。</p>
<h2 id="federated-db--system-role-視角跨-case-合成-frame">Federated DB + system role 視角（跨 case 合成 frame）</h2>
<blockquote>
<p>本段也是 <em>跨 case 合成 frame</em>（F2.18 + F1.6）— 三個 rich case（Coinbase / Toyota / Forbes）都揭露 production 系統是 <em>DB + 周邊工具</em> 組合、不是單一 DB monolithic 撐起來。</p></blockquote>
<p>讀者常誤以為「全用 X」是正解 — 全用 MongoDB、或全遷 DynamoDB、或全換 Cosmos DB。真實 production case 揭露兩個更前置的事實：(a) production 系統是 <em>federated</em>（多 DB 按 workload 分流）、不是 monolithic；(b) 每個 vendor 在系統中扮演 <em>特定角色</em>（control plane vs data plane vs cache）、不是 all-purpose store。</p>
<h3 id="federated-db-by-workload">Federated DB by workload</h3>
<p>Coinbase（9.C36）production 配置：MongoDB Atlas（document 主資料、identity service）+ DynamoDB（部分固定 KV workload）+ Memcached（read cache）+ mongobetween（connection proxy）+ Kinesis（event stream）。不是「全用 MongoDB」也不是「全遷 DynamoDB」、是按 workload shape 分流。</p>
<p>Toyota Connected（9.C38）：MongoDB Atlas 20 個 DB（microservice 拆 blast radius）+ Lambda + Kinesis + Redis + Kubernetes。20 個 DB 不是吞吐撐不住（18B txn/月 ≈ 7K txn/sec、單一 cluster 撐得下）、是 <em>microservice ownership</em> + <em>blast radius</em> 切分（F2.6）。</p>
<p>Forbes（9.C37）：MongoDB Atlas + 中介 abstraction layer + 50+ microservice。abstraction layer 隔離 schema 變動、避免 50 個服務都依賴 DB schema 細節（F2.3）。</p>
<p>三 case 揭露的共同 frame 是：<strong>寫 production 系統時假設「DB 一個服務搞定」、忽略 cache / queue / proxy / abstraction layer 跨層責任、會撞 connection limit / cache miss / cross-region replication 等隱性瓶頸</strong>。</p>
<h3 id="system-rolecontrol-plane-vs-data-plane">System role：control plane vs data plane</h3>
<p>DynamoDB 在 surge 場景能撐 nearly infinitely 不是 DynamoDB 自己神奇、是 <em>系統架構解耦</em> 的結果（F1.6）：</p>
<ul>
<li><strong>Control plane（metadata、state、user record）</strong>：DynamoDB / MongoDB / Cosmos DB 適合 — 流量是 small payload + high QPS pattern</li>
<li><strong>Data plane（影音、大型 BLOB、media stream）</strong>：CDN / S3 / object storage、<em>不在 DB3 範圍</em> — 流量是 large payload + bandwidth-bound</li>
<li><strong>Cache layer</strong>：Redis / Memcached / DAX（DynamoDB 補位）— 跟主 DB 形成跨層架構、處理讀峰值 + read-your-own-write 一致性</li>
</ul>
<p>三個 case 揭露同一 frame：Zoom 視訊 metadata 走 DynamoDB、影音走 WebRTC / edge servers；Disney+ watchlist 走 DynamoDB、影片串流走 CDN + S3；Capcom game state 走 DynamoDB + DAX、game server 走 EKS。<strong>把影音串流塞 DynamoDB 是違反 control plane vs data plane 分離、容量規劃會錯</strong>（每筆 1KB 的 KV vs 每筆 100MB 的 media chunk 是不同 workload）。</p>
<h2 id="三-vendor-對比-10-軸">三 vendor 對比 10 軸</h2>
<p>下表是三 vendor 在 selection 階段的 10 軸對比。每個軸後續都有 per-vendor deep article 展開機制、本文不重複展開。</p>
<table>
  <thead>
      <tr>
          <th>軸</th>
          <th>MongoDB</th>
          <th>DynamoDB</th>
          <th>Cosmos DB</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>資料模型核心</strong></td>
          <td>Document（aggregate root）+ aggregation pipeline</td>
          <td>KV with optional document fields + GSI / LSI</td>
          <td>Multi-model（SQL / MongoDB / Cassandra / Gremlin / Table API）</td>
      </tr>
      <tr>
          <td><strong>部署 topology</strong></td>
          <td>跨雲（Atlas AWS / GCP / Azure）+ self-hosted</td>
          <td>AWS-only managed</td>
          <td>Azure-only managed</td>
      </tr>
      <tr>
          <td><strong>跨雲 hedging</strong></td>
          <td>高（Atlas 跨雲、Forbes case）</td>
          <td>無（AWS lock-in）</td>
          <td>無（Azure lock-in）</td>
      </tr>
      <tr>
          <td><strong>Capacity 抽象</strong></td>
          <td>CPU + IOPS + working set RAM 三軸</td>
          <td>WCU/RCU + on-demand/provisioned + adaptive capacity</td>
          <td>RU（Request Unit）+ 5 consistency level</td>
      </tr>
      <tr>
          <td><strong>Contract layer</strong></td>
          <td>DB 層 <code>$jsonSchema</code> validator / app 層 abstraction / 混合</td>
          <td>DynamoDB Stream + app 層 validator</td>
          <td>DB 層 stored procedure + app 層 validator</td>
      </tr>
      <tr>
          <td><strong>Partition / shard key 可逆性</strong></td>
          <td><code>reshardCollection</code> 4.4+ 可改、成本高</td>
          <td>可改用 backfill</td>
          <td>不可改、必 export-recreate</td>
      </tr>
      <tr>
          <td><strong>Consistency model</strong></td>
          <td>Read concern（local / majority / linearizable）+ causal consistency session</td>
          <td>Eventually / strongly consistent reads</td>
          <td>5 level spectrum（Strong / Bounded staleness / Session / Consistent prefix / Eventual）</td>
      </tr>
      <tr>
          <td><strong>Multi-region write</strong></td>
          <td>Atlas 跨 region 手動 conflict 處理</td>
          <td>Global Tables LWW</td>
          <td>Multi-region write（Strong 互斥、見 cosmosdb/multi-region-write-conflict SSoT）</td>
      </tr>
      <tr>
          <td><strong>Dogfood signal</strong></td>
          <td>無（MongoDB 是獨立公司、不適用）</td>
          <td>Amazon 自家高頻使用（9.C5 Amazon Ads / 9.C27 Disney+ etc）</td>
          <td>Microsoft 365 dogfood（9.C30、<strong>Scope warning</strong>：dogfood 數字不公開、是 selection signal 不是 benchmark）</td>
      </tr>
      <tr>
          <td><strong>Multi-model 差異化</strong></td>
          <td>單一 document model</td>
          <td>單一 KV-with-document model</td>
          <td>唯一單服務支援 5 API（差異化價值、F2.16）</td>
      </tr>
  </tbody>
</table>
<h3 id="軸的延伸子段">軸的延伸子段</h3>
<p><strong>部署 topology / 跨雲 hedging</strong>：三家 topology 是 <em>vendor lock-in</em> 跟 <em>跨雲彈性</em> 的硬取捨。Forbes 選 Atlas 不是當下省錢（自管 MongoDB 也可以、TCO 改善是副作用）、是 <em>未來雲商策略尚未底定</em> 的 hedging — Atlas 提供 AWS / GCP / Azure 三家部署、未來換雲不用換 DB（F2.10）。對照 DynamoDB / Cosmos DB / Spanner / Aurora 都是單雲鎖定 — 選了就跟著該雲商生態走。團隊雲商策略已底定（深度用 AWS / Azure / GCP 其一）時、單雲 vendor 通常較划算（更好的 IAM 整合、更深的 ops 工具、單一 support 通道）。跨雲價值真正成立是 <em>策略不確定</em> 或 <em>合規要求多雲</em> 場景。</p>
<p><strong>Capacity 抽象</strong>：三家 capacity 抽象的 <em>思維遷移成本</em> 可能高過 vendor 廣告的價差（F2.12）。MongoDB 用 CPU + IOPS + working set RAM 三軸思維、跟自管 PostgreSQL / MySQL 類似、團隊轉換成本低。DynamoDB 用 WCU/RCU 抽象、要學「估每個操作消耗多少 unit」、加上 on-demand / provisioned / adaptive capacity 三模式選擇。Cosmos DB 用 <a href="/blog/backend/knowledge-cards/request-unit/" data-link-title="Request Unit" data-link-desc="Cosmos DB 的容量抽象單位、1 RU = 1KB document strong-consistent read 的 CPU &#43; memory &#43; IOPS 綜合 cost、寫 ~5 RU、複雜 query 數百 RU">Request Unit</a>（RU）抽象、1 RU ≈ 1 KB document 的 strong read 成本、寫 ~5 RU、複雜 query 數百 RU — 工程師要學會用 RU 思考、不是用 CPU 思考、團隊知識遷移成本可能高。容量規劃延伸見對應 vendor 的 sizing article。</p>
<p><strong>Partition / shard key 可逆性</strong>：三家 <em>不在同一光譜</em>、是選 vendor 前必做的 access pattern audit 重點（F2.15）。MongoDB <code>reshardCollection</code>（4.4+）可改、但成本高、需要 cluster downtime 或長時間 background migration。DynamoDB partition key 技術上可改、實作上用 backfill（建新 table、新 PK、雙寫舊新、cutover）— ops 工作量大但可逆。Cosmos DB partition key <em>不可改</em>、改 partition key 等於 export-recreate-import — 對 1TB+ 資料是大型 migration 工程。三家不可逆性遞增、選 Cosmos DB 前必須前期完整 access pattern audit、不能「先上 production 之後再調」。</p>
<p><strong>Consistency model</strong>：三家機制設計哲學不同。MongoDB read concern 是 <em>per-operation</em> 選擇（同一 client connection 可以混用）；DynamoDB strong vs eventual 是 <em>per-read</em> 選項（write 端統一強一致）；Cosmos DB 5 個 level 是 <em>account-level default + per-request override</em>、且 Strong 跟 multi-region write 互斥（CAP 硬約束）。設計上 MongoDB 最 flexible、Cosmos DB 最 explicit、DynamoDB 介於中間。延伸機制細節見 <a href="/blog/backend/01-database/vendors/cosmosdb/consistency-levels-engineering/" data-link-title="Cosmos DB 5 Consistency Levels：Session 預設、Bounded staleness、Strong 邊界跟跨 collection 分流策略" data-link-desc="Cosmos DB 5 個 consistency level 的工程選擇邏輯、Session 為何是 production 預設、per-request override 跟跨 collection 分流的進階策略、Strong &#43; multi-region 互斥的 cross-link — 從 Minecraft Earth &#43; ASOS 切入">Cosmos DB consistency levels engineering</a>、<a href="/blog/backend/01-database/vendors/cosmosdb/multi-region-write-conflict/" data-link-title="Cosmos DB Multi-Region Write：active-active、LWW、custom merge、Strong &#43; multi-region 互斥的 AP 取捨" data-link-desc="Multi-region active-active write 的 conflict resolution（LWW / custom merge / conflict feed）、Strong 跟 multi-region write 為什麼互斥、廣告 SLA vs 實測可用性鏈路拆解 — 從 Minecraft Earth &#43; Toyota Connected 切入">Cosmos DB multi-region write conflict</a>（SSoT 主寫位置）。</p>
<p><strong>Multi-model 差異化</strong>：Cosmos DB 是 <em>唯一單一服務支援 5 API</em> 的雲商 DB（SQL / MongoDB / Cassandra / Gremlin / Table）— 對照 AWS 走多產品覆蓋（DynamoDB KV + DocumentDB MongoDB-compat + Neptune graph + Keyspaces Cassandra-compat）、GCP 走多產品覆蓋（Firestore + Spanner + Bigtable）。multi-model 的差異化價值是 <em>減少多 DB 並存運維</em> — 一個產品團隊只養一個 service、一套 IAM、一套 backup / DR、一套 monitoring。但 <em>是否真用上 multi-model</em> 要看團隊實際 workload — 多數團隊只用 1-2 個 API、單一 model 的競品（DynamoDB / MongoDB）可能更專注（F2.16）。</p>
<h2 id="失敗模式cross-vendor-反模式">失敗模式（cross-vendor 反模式）</h2>
<p>下列七條是三 vendor 都會踩、跨 case 共通的反模式。Per-vendor 特定反模式（例如 DynamoDB on-demand 隱性 hot partition、MongoDB schema 三代並存）在 per-vendor deep article。</p>
<h3 id="反模式-1把-dynamodb-當-oltp">反模式 1：把 DynamoDB 當 OLTP</h3>
<p>訊號：access pattern 還在探索期、5+ 種 query 還會增加、強一致 cross-partition transaction 是產品契約。應回 PostgreSQL / Aurora、不是繼續加碼 DynamoDB single-table design。</p>
<p>DynamoDB 的 <em>正確</em> 用法包含 control plane KV（Zoom / Disney+ / Capcom）跟 durable queue / write buffer（Tixcraft 9.C15 揭露的非 OLTP 正向用例、F1.3）— DynamoDB 接「訂單」寫入、不是即時生效、是讓 traditional server（金流 / 票庫）用自己能承受的速度消費。這層解耦讓「前端可以擴 130 倍、後端不用同步擴」。</p>
<h3 id="反模式-2把-mongodb-當-kv">反模式 2：把 MongoDB 當 KV</h3>
<p>訊號：access pattern 固定、PK 天然均勻、不需要 aggregation pipeline、document 內部從不展開（只查 root 欄位）。</p>
<p>應改 DynamoDB / Cosmos DB Table API。MongoDB 在這場景的 overhead（document overhead / connection model / aggregation engine 未用上）不划算 — KV vendor 的單筆讀寫成本更低、scaling 模型更簡單。</p>
<h3 id="反模式-3把-cosmos-db-當跨雲服務">反模式 3：把 Cosmos DB 當跨雲服務</h3>
<p>訊號：團隊評估 multi-cloud DR / 跨雲 portability、看到 Cosmos DB 文件強調「global distribution」就以為支援跨雲。</p>
<p>Cosmos DB 是 <em>Azure-only</em>、global distribution 指 Azure 內跨 region。想跨雲應改 MongoDB Atlas。multi-model 差異化是 <em>Azure 生態內</em> 的價值（F2.16）— 一旦離開 Azure、Cosmos DB 的所有獨特優勢都不存在。</p>
<h3 id="反模式-4federated-db-假設全用-x">反模式 4：federated DB 假設「全用 X」</h3>
<p>訊號：寫架構設計時假設「DB 一個服務搞定」、不規劃 cache / queue / proxy / abstraction layer。</p>
<p>Production 真實系統都是 federated（Coinbase / Toyota / Forbes 都是）。寫架構時假設一個 DB 搞定會撞 connection limit（surge 下 RDB 第一個爆點、F1.7）/ cache miss（單靠 DB 撐不住讀峰值）/ cross-region replication（跨 region 一致性處理錯）等隱性瓶頸。預先設計 federated topology + 跨層責任分配、不是事後補。</p>
<h3 id="反模式-5誤判-dogfood-case-數字">反模式 5：誤判 dogfood case 數字</h3>
<p>訊號：引用 Microsoft 365 / Amazon Prime Day 等 dogfood case 時、把它當 production benchmark、抄具體數字當 sizing 依據。</p>
<p>Dogfood case 數字常 <em>不公開</em> 或 <em>不適用 customer-facing</em>（F2.17 + F1.10）— Amazon Prime Day 「90M reads/sec」是年度峰值最高一秒不是平均、Microsoft 365 直接沒給數字、Google Spanner「10 億 req/sec」是 Google 全使用者加總不是單客戶配額。寫架構時引用要明示 selection signal（雲商賭身家、值得當高權重 vendor 訊號）vs production benchmark（具體 sizing 數字）— 兩者不可混為一談。</p>
<h3 id="反模式-6partition-key-一上-production-才發現不可逆">反模式 6：partition key 一上 production 才發現不可逆</h3>
<p>訊號：選 Cosmos DB / DynamoDB 時、partition key 設計沒做完整 access pattern audit、上 production 一段時間後發現 hot partition、想改 PK。</p>
<p>三家不在同一光譜（見前段對比表）— MongoDB shard key 4.4+ 可改但成本高、DynamoDB 可 backfill 改、Cosmos DB <em>不可改</em> 必 export-recreate。選 Cosmos DB 前要前期完整 access pattern audit、列所有預期 query 跟對應 PK 訪問頻率、確認最熱 PK 流量在單一 partition 容量上限內（F2.15）。</p>
<h3 id="反模式-7wire-compatibility-當-100-行為相同">反模式 7：wire compatibility 當 100% 行為相同</h3>
<p>訊號：選 Cosmos DB MongoDB API 或 DocumentDB、看到「MongoDB compatible」就假設 MongoDB driver 跑得起來就是相容、跳過 query pattern 驗證。</p>
<p>Wire compat ≠ 行為 100% 相同（F2.9）。Cosmos DB MongoDB API 廣告「100% wire compatibility」是行銷話術、實際是「在某些 query pattern 下相容」— aggregation pipeline 某些 stage 不支援、transaction edge case 行為差異、index 行為差異都會踩到。遷移必須 dual-write per query pattern 驗證、不是看 vendor spec list。</p>
<h2 id="不該選-db3-的訊號升-sql--升-distributed-sql-路徑">不該選 DB3 的訊號（升 SQL / 升 distributed SQL 路徑）</h2>
<p>下列四條訊號出現時、選擇應跳出 DB3 範圍。</p>
<ul>
<li><strong>JOIN-heavy + 強 normalize workload</strong>：應留 PostgreSQL（包括 PostgreSQL + JSONB 混合方案）、不該塞 NoSQL 再 <code>$lookup</code>。aggregation pipeline 的 <code>$lookup</code> 性能遠不如 SQL JOIN、在 sharded cluster 還有限制。</li>
<li><strong>強一致 cross-region transaction 是產品契約</strong>：應進 <a href="/blog/backend/01-database/vendors/cockroachdb/aurora-dsql-spanner-decision-tree/" data-link-title="CockroachDB vs Aurora DSQL vs Spanner：撞牆訊號分型 &#43; 七問題決策樹" data-link-desc="Distributed SQL 三選一決策樹。先用撞牆訊號分型識別 driver path（DoorDash 單主寫入撞牆 / Netflix Cassandra 缺口 / Hard Rock 合規驅動）、再走七問題（跨雲 / 雲商生態 / 風險預算 / PG 相容 / 管理負擔 / team size / vendor sizing barrier）。PostgreSQL 相容性 audit checklist 4 項、Spanner 100 pu sizing barrier、Hard Rock 「省 10-20 工程師」機會成本警示、Netflix Database Platform Team 規模">DB4 entry point</a> 評估 distributed SQL（CockroachDB / Spanner / Aurora DSQL）。三家 NoSQL 的 cross-region transaction 都有 limitation、不該當主路徑。</li>
<li><strong>大流量 + 跨業務 fleet 治理</strong>：Aurora 200 cluster 模式（9.C4 DraftKings 揭露的 business sharding fleet）可能更合適、進 Aurora fleet 治理。NoSQL 的 fleet 治理工具鏈（cluster lifecycle / cross-cluster query / unified IAM）通常不如 managed SQL 成熟。</li>
<li><strong>資料模型還在探索 + access pattern 變動快</strong>：暫緩 NoSQL 選型、用 PostgreSQL + JSONB 過渡。JSONB 給 document-like flexibility、SQL 給 ad-hoc query power、未來釐清穩定 access pattern 後再選 NoSQL 不遲。</li>
</ul>
<h2 id="下一步路由per-vendor-outline-子組">下一步路由（per-vendor outline 子組）</h2>
<p>讀者識別 workload type（軸 1-3）+ migration path（三型）+ system role（federated / control plane）後、進對應 per-vendor 子組繼續深化。</p>
<h3 id="mongodb-子組">MongoDB 子組</h3>
<ul>
<li>入門：<a href="/blog/backend/01-database/vendors/mongodb/schema-design-pattern/" data-link-title="MongoDB Schema Design Pattern：contract layer 在哪 vs embedded / reference" data-link-desc="MongoDB document schema 真正的 production 議題不是 embedded vs reference 二選一、是 schema contract 該放 DB 層 validator 還是 app 層 abstraction；含 Toyota polymorphic governance、Forbes abstraction layer、time-series collection 邊界">schema design pattern</a>（contract layer 三選一：DB 層 validator / app 層 abstraction / 混合）</li>
<li>容量：<a href="/blog/backend/01-database/vendors/mongodb/shard-key-selection/" data-link-title="MongoDB Shard Key Selection：hashed vs ranged、單 cluster 切 shard vs 多 cluster 切 blast radius" data-link-desc="MongoDB sharded cluster shard key 選型（hashed / ranged / compound）、單 cluster 分 shard vs 多 cluster 分 blast radius 對照、跟 DynamoDB / Cosmos DB partition key 可逆性的跨 vendor 紀律">shard key selection</a>（單 cluster vs 多 cluster blast radius、Toyota 20 DB 模式）</li>
<li>Migration：<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 暴漲）">migrate to Atlas</a>（同 DB 換託管型）</li>
</ul>
<h3 id="dynamodb-子組">DynamoDB 子組</h3>
<ul>
<li>入門：<a href="/blog/backend/01-database/vendors/dynamodb/single-table-design-pattern/" data-link-title="DynamoDB Single-Table Design：從適用度前置判讀到 access pattern 反推 PK/SK" data-link-desc="DynamoDB single-table 設計不是「資料表越少越好」，而是 access pattern 反推 PK/SK 跟 GSI；本文先做 DynamoDB 適用度 4 軸前置判讀（PK 天然均勻 / control plane vs data plane / consistency / access pattern 穩定），再展開設計流程、failure modes 與 durable queue 正向用例">single-table design pattern</a>（access pattern 設計 + 適用度前置判讀）</li>
<li>機制：<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 踩雷">consistency model optimization</a>（strong vs eventually consistent 取捨）</li>
</ul>
<h3 id="cosmos-db-子組">Cosmos DB 子組</h3>
<ul>
<li>入門：<a href="/blog/backend/01-database/vendors/cosmosdb/mongodb-api-vs-sql-api/" data-link-title="Cosmos DB MongoDB API vs SQL API：遷移路徑、dogfood signal、multi-model、跨雲 hedging" data-link-desc="從『MongoDB API 跟 SQL API 哪個快』推進到 vendor selection 的四層問題：三型遷移路徑、dogfood signal 怎麼讀、multi-model 差異化、跨雲 hedging — 從 Microsoft 365 dogfood 案例切入">MongoDB API vs SQL API</a>（API model 選型、四層 framing）</li>
</ul>
<h3 id="跨層架構federated-db--cache--proxy">跨層架構（federated DB / cache / proxy）</h3>
<p>跨層架構的延伸內容見對應 per-vendor connection management / cache layer article（後續會寫）— 本文只在軸 2 / federated frame 點到、不展開機制。</p>
<h3 id="進-db4-evaluation">進 DB4 evaluation</h3>
<p>若需要強一致 cross-region SQL / paradigm shift（KV → distributed SQL 或 SQL → distributed SQL）、進 <a href="/blog/backend/01-database/vendors/cockroachdb/aurora-dsql-spanner-decision-tree/" data-link-title="CockroachDB vs Aurora DSQL vs Spanner：撞牆訊號分型 &#43; 七問題決策樹" data-link-desc="Distributed SQL 三選一決策樹。先用撞牆訊號分型識別 driver path（DoorDash 單主寫入撞牆 / Netflix Cassandra 缺口 / Hard Rock 合規驅動）、再走七問題（跨雲 / 雲商生態 / 風險預算 / PG 相容 / 管理負擔 / team size / vendor sizing barrier）。PostgreSQL 相容性 audit checklist 4 項、Spanner 100 pu sizing barrier、Hard Rock 「省 10-20 工程師」機會成本警示、Netflix Database Platform Team 規模">DB4 entry point: Aurora DSQL / Spanner / CockroachDB decision tree</a>。</p>
<h2 id="knowledge-card-路由">Knowledge card 路由</h2>
<p>本文涉及的 knowledge card：</p>
<ul>
<li><a href="/blog/backend/knowledge-cards/document-store/" data-link-title="Document Store" data-link-desc="說明以 JSON 文件與彈性 schema 提供資料存取的模式，以及它仍需的治理邊界">document-store</a> — document model 的核心概念跟 aggregate root 邊界</li>
<li><a href="/blog/backend/knowledge-cards/hot-partition/" data-link-title="Hot Partition" data-link-desc="說明分散式 KV / OLTP 中、單一 partition 流量遠超其他的容量問題">hot-partition</a> — KV vendor 的 partition 容量上限機制</li>
<li><a href="/blog/backend/knowledge-cards/database-sharding/" data-link-title="Database Sharding" data-link-desc="說明資料庫如何依 shard key 分散資料、路由請求與承擔跨 shard 查詢成本">database-sharding</a> — shard key 跟 partition key 設計</li>
<li><a href="/blog/backend/knowledge-cards/consistency-level/" data-link-title="Consistency Level" data-link-desc="資料系統對讀寫一致性語意的可選擇層級">consistency-level</a> — strong / eventual / session 三類取捨</li>
<li><a href="/blog/backend/knowledge-cards/vendor-lock-in/" data-link-title="Vendor Lock-In" data-link-desc="說明採用供應商產品後，其 API 與格式滲入程式碼造成的退出成本">vendor-lock-in</a> — 單雲 vs 跨雲的 hedging 取捨</li>
<li><a href="/blog/backend/knowledge-cards/distributed-sql/" data-link-title="Distributed SQL" data-link-desc="把 SQL 與交易語意延伸到多節點與多區域的資料庫形態">distributed-sql</a> — 跳出 DB3 進 DB4 的概念入口</li>
</ul>
]]></content:encoded></item></channel></rss>