# 引用与嵌套文档的选择

URL: https://caijiao.org/mongodb/04-modeling/04-ref-vs-embed
Source: docs/mongodb/04-modeling/04-ref-vs-embed.md
Description: 本章节讲解在 MongoDB 中选择引用（Referencing）还是嵌套文档（Embedding）的方法，帮助用户设计合理的数据模型。

[MongoDB](/mongodb/) 支持两种数据关系建模方式：嵌套文档和引用。选择合适的方式有助于提高查询效率和维护简便性。

## 嵌套文档（Embedding）

将相关数据直接嵌入主文档中，适用于紧密关联且经常一起访问的数据。

优点：

- 查询简单，避免跨集合操作。
- 读性能高，减少多次查询。
- 保持数据一致性方便。

缺点：

- 嵌套过深可能导致文档膨胀，超出 16MB 限制。
- 更新嵌套数据可能复杂。

示例：

```json
{
  "_id": 1,
  "name": "Alice",
  "orders": [
    { "order_id": 101, "amount": 200 },
    { "order_id": 102, "amount": 150 }
  ]
}
````

## 引用（Referencing）

通过存储关联文档的 `_id`，实现数据关联，适合关系复杂或数据共享的场景。

优点：

- 文档体积小，易于扩展。
- 支持复杂关系和多对多关联。
- 数据更新独立，减少冗余。

缺点：

- 查询时需要额外的连接操作（聚合或多次查询）。
- 保证数据一致性较复杂。

示例：

```json
// 用户文档
{
  "_id": 1,
  "name": "Alice"
}

// 订单文档
{
  "_id": 101,
  "user_id": 1,
  "amount": 200
}
```

## 选择建议

- 频繁联合访问且数据量较小，优先考虑嵌套文档。
- 数据关系复杂、多对多或共享，选择引用。
- 注意文档大小限制，避免单个文档过大。
- 结合业务场景灵活设计，平衡性能与维护。

---

合理使用引用和嵌套文档设计，能有效提升 MongoDB 应用的性能和可维护性。
