MongoDB 是无模式,因为它以文档的形式存储数据,通常使用 BSON(二进制 JSON)。集合中的每个文档都可以有自己的结构,这意味着不需要预定义字段及其数据类型。
示例:
这种灵活性使 MongoDB 能够适应不断变化的数据模型,而无需修改架构。
MongoDB 提供了两种主要方法来建模文档之间的关系:嵌入 和 引用。
嵌入:在单个文档中存储相关数据。
{ "_id": 1, "name": "John Doe", "orders": [ { "orderId": 101, "total": 50 }, { "orderId": 102, "total": 75 } ] }
引用:将相关数据存储在单独的文档中并使用引用(即ObjectId)来链接它们。
// Customer document { "_id": 1, "name": "John Doe" } // Order document { "orderId": 101, "customerId": 1, "total": 50 }
一对多关系通常通过将“多”项嵌入“一个”文档或通过引用来建模。
{ "_id": 1, "name": "John", "addresses": [ { "street": "123 Main St", "city": "City A" }, { "street": "456 Elm St", "city": "City B" } ] }
// Parent document { "_id": 1, "name": "John" } // Child document { "addressId": 1, "street": "123 Main St", "city": "City A" }
上限集合 是一个固定大小的集合,当达到其大小限制时,它会自动覆盖最旧的文档。上限集合非常适合最新数据最重要的场景,例如日志或事件数据。
特征:
示例:
创建一个大小限制为 1MB 且最多 1000 个文档的上限集合:
{ "_id": 1, "name": "John Doe", "orders": [ { "orderId": 101, "total": 50 }, { "orderId": 102, "total": 75 } ] }
在 MongoDB 中,文档大小 可以直接影响性能。文档的最大大小为 16MB。接近此大小的文档可能:
为了提高性能,保持文档紧凑并避免过度增长非常重要,特别是在高写入环境中。
反规范化涉及跨多个文档复制数据以减少连接的需要。通过嵌入相关数据,MongoDB 可以避免执行多个查询或联接,从而加快读取速度。
示例:不要在订单中引用产品,而是将产品详细信息直接嵌入订单文档中:
// Customer document { "_id": 1, "name": "John Doe" } // Order document { "orderId": 101, "customerId": 1, "total": 50 }
GridFS 是用于在 MongoDB 中存储和检索大文件(大于 16MB)的规范。它将大文件分割成块(通常为 255KB),并将它们作为文档存储在两个集合中:fs.files 和 fs.chunks。
示例:存储大图像文件:
{ "_id": 1, "name": "John", "addresses": [ { "street": "123 Main St", "city": "City A" }, { "street": "456 Elm St", "city": "City B" } ] }
对于层次结构数据,您可以根据层次结构的深度和复杂性使用嵌入或引用。
{ "_id": 1, "name": "John Doe", "orders": [ { "orderId": 101, "total": 50 }, { "orderId": 102, "total": 75 } ] }
// Customer document { "_id": 1, "name": "John Doe" } // Order document { "orderId": 101, "customerId": 1, "total": 50 }
TTL 索引会在指定时间段后自动从集合中删除文档,这对于会话信息或日志等过期数据非常有用。
语法:
{ "_id": 1, "name": "John", "addresses": [ { "street": "123 Main St", "city": "City A" }, { "street": "456 Elm St", "city": "City B" } ] }
多对多关系可以通过在每个文档中嵌入引用数组或创建第三个集合来存储关系来建模。
// Parent document { "_id": 1, "name": "John" } // Child document { "addressId": 1, "street": "123 Main St", "city": "City A" }
db.createCollection("logs", { capped: true, size: 1048576, max: 1000 })
MongoDB 提供灵活的模式设计功能,使其能够适应各种用例,包括复杂的关系和数据建模策略。正确的架构设计选择可以提高应用程序的性能和可扩展性。
嗨,我是 Abhay Singh Kathayat!
我是一名全栈开发人员,精通前端和后端技术。我使用各种编程语言和框架来构建高效、可扩展且用户友好的应用程序。
请随时通过我的商务电子邮件与我联系:kaashshorts28@gmail.com。
以上是在 MongoDB 中设计高效的数据模型:无模式、关系和性能优化的详细内容。更多信息请关注PHP中文网其他相关文章!