MongoDB 的模式设计,核心不是“第三范式”,而是:
数据如何被读,如何被写,如何一起被访问。
一句话原则:
一起访问的数据,尽量放在一起设计时可以用这套顺序:
- 先列出最重要的查询
- 再列出最高频的写入
- 判断哪些数据总是一起出现
- 判断哪些子结构会无限增长
- 决定嵌套、引用,还是混合方案
- 最后再为关键查询配索引
看一个电商商品页例子。
用户打开商品页时,往往要同时看到:
- 商品基本信息
- 当前价格
- 库存
- 前几条精选评论
那一个常见设计是:
- 商品主文档里嵌入“展示所需的核心字段”
- 评论单独放集合
- 需要时再按商品 ID 查询评论
- 如果首页只展示少量最新评论,也可以冗余几条摘要
这就是典型的按访问路径设计,不是按理论实体图死拆。
灵活结构成熟后,通常还会配上模式验证,避免仓库逐渐失控。比如:
db.createCollection("products", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "price", "status"],
properties: {
name: { bsonType: "string" },
price: { bsonType: "decimal" },
status: { enum: ["draft", "active", "archived"] }
}
}
}
})这相当于在弹性档案仓门口加规则:
- 档案袋仍然可以灵活
- 但关键栏位必须合法
- 不允许把明显错误的资料塞进仓库