You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求详解CosmosDB Ladder模式及应用示例

Great question! I’ve worked with the Ladder Pattern (sometimes referred to as the Hierarchical Reference Pattern) in Azure Cosmos DB (formerly DocumentDB) specifically to solve exactly the problem you’re describing—managing duplicated/referenced data without having to update every copy when the source record changes.

What is the Ladder Pattern?

The Ladder Pattern is a document database design pattern that balances data redundancy, query performance, and maintainability. It works by storing a lightweight "snapshot" of critical reference data in child documents, paired with a direct reference to the master record. This way:

  • You retain the context/state of the reference data at the time the child document was created (e.g., a product’s price when an order was placed)
  • You avoid the overhead of updating every child document when the master record changes
  • You can easily fetch the latest version of the reference data whenever needed via the reference
Core Idea

Instead of embedding full copies of master data in every child document (which creates a maintenance nightmare when the master updates), or only storing a reference (which forces you to join/query the master every time you need context), the Ladder Pattern splits the difference:

  1. Snapshot: Store minimal, time-sensitive fields from the master record in the child document (what you need for historical context)
  2. Reference: Store a unique identifier for the master record (so you can pull the latest data on demand)
Practical Example

Let’s use an e-commerce scenario—products and orders—to make this concrete.

Master Product Document

First, your master product record (stored in a products container):

{
  "id": "prod_wireless_headphones_001",
  "type": "product",
  "name": "Noise-Cancelling Wireless Headphones",
  "currentPrice": 109.99,
  "description": "Over-ear headphones with 30-hour battery life",
  "lastUpdated": "2024-05-20T16:45:00Z"
}

Order Document Using the Ladder Pattern

Now, an order document (stored in an orders container) that references the product:

{
  "id": "order_cust_john_doe_007",
  "type": "order",
  "customerId": "cust_john_doe",
  "orderDate": "2024-05-18T10:30:00Z",
  "items": [
    {
      "productLadder": {
        "snapshot": {
          "productId": "prod_wireless_headphones_001",
          "nameAtPurchase": "Noise-Cancelling Wireless Headphones",
          "priceAtPurchase": 99.99
        },
        "masterRef": "prod_wireless_headphones_001"
      },
      "quantity": 2
    }
  ]
}
Why This Solves Your Problem
  • No mass updates needed: When the product’s price increases to $109.99, you only update the master products document. You don’t have to touch any of the existing orders that reference this product.
  • Historical context preserved: The order retains the price the customer actually paid ($99.99), which is critical for business records.
  • Access to latest data: If you need to show the current product price or details when a user views their order, your application can use the masterRef to query the latest product record directly.
Key Considerations
  • Keep snapshots minimal: Only store fields that are critical for historical context (e.g., purchase price, name at the time). Avoid duplicating all master fields—this defeats the purpose of the pattern.
  • Handle query logic: In Cosmos DB, you’ll need to implement a client-side join (or use a stored procedure) to fetch the latest master data when needed. This is a small tradeoff for avoiding massive update operations.
  • Consistency: This pattern works best for eventually consistent scenarios. If you need strong consistency between child and master records, you may need to supplement with transactions or change feed triggers (but that adds complexity).

内容的提问来源于stack exchange,提问作者Mexicoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:06:06