MongoDB 是一种 NoSQL 数据库,与传统的关系型数据库相比,MongoDB 的 schema 设计更加灵活和自由。
但是,灵活与自由并不意味着没有规律可循,好的 schema 设计需要考虑多方面因素,包括数据结构、查询效率、数据一致性等等。
本文将从原则、实践和示例等方面,介绍 MongoDB Schema 的最佳实践。
原则
在设计 MongoDB Schema 时,有几个原则需要遵循:
将关联数据放在一起。与关系型数据库不同,MongoDB 不支持多表 join,因此需要将相关数据尽可能地放在一个文档中。
保持文档小而有结构。MongoDB 的优点之一是文档的结构可以比较自由,但是过于自由会导致文档过大,特别是嵌套层数过深的文档。因此,需要在自由度和结构化之间寻找平衡。
尽量避免使用多态。MongoDB 支持多态,但是在某些情况下,多态会导致查询效率低下或者数据一致性受到影响。
实践
在遵循原则的基础上,下面是一些常见的最佳实践:
1. 使用 reference 而不是 embed
MongoDB 支持嵌套文档,但嵌套文档会导致文档过大,特别是当嵌套层数过深时。相比之下,使用 reference 来关联不同的文档,可以使文档更小,更易于维护。
例如,在一个 blog 应用程序中,一个博客文章可能有多个评论。可以使用 reference 来关联博客文章和评论:
-- -------------------- ---- ------- - ------ ----------------- -------- -------- ------ -------- ---------- ------ ----------- - ------------ ------------ ----------- - - - ------ ------------ -------- --------------------- ------- ------ - - ------ ------------ -------- --------------------- ------- ------ - - ------ ------------ -------- --------------------- ------- ------ -
可以看到,博客文章文档中的 comments
字段是一个包含评论 ID 的数组。这些评论文档单独存在,并且可以在需要时进行查询和操作。
2. 使用 sub-document 而不是多个字段
MongoDB 支持在一个文档中创建多个字段,但如果这些字段之间有关联,最好将其封装为一个 sub-document。这样可以避免应用程序中的代码使用多个字段并导致混淆。
例如,在一个在线商店应用程序中,可以将订单信息封装为一个 sub-document:
-- -------------------- ---- ------- - ------ ---------- -------------- ------------- -------- - - ------------- ------------ ----------- -- -------- --- -- - ------------- ------------ ----------- -- -------- -- - -- --------- ----- -
在这个例子中,items
字段是一个包含 sub-document 的数组。每个 sub-document 表示一个订单条目,其中包含商品 ID、数量和价格等信息。
3. 使用枚举值作为字符串
MongoDB 的文档结构是自由的,但查询效率很大程度上受到数据类型的影响。如果将字符串作为枚举值使用,可以使查询结果更加精确。
例如,在一个论坛应用程序中,可以使用枚举值将帖子分类:
{ "_id": "post_1", "title": "MongoDB Schema 设计最佳实践", "category": "数据库" }
在这个例子中,category
字段只有少数几个可选值,可以使用字符串作为枚举值来表示。
示例代码
下面是一个使用 MongoDB 的 Node.js 示例代码,用于向数据库中插入一些文档:
-- -------------------- ---- ------- ----- ----------- - ------------------------------- ----- --- - -------------------------------------- ----- ------ - --- ---------------- ----------------- ------- -------------------- -- - -- ----- - ------------------- ------- - ---------------------- -- ---------- ----- -- - ----------------------- ----- ---------- - ----------------------- ----- ---- - - - ---- -------- ----- -------- ---- --- ------ ------------------- -- - ---- -------- ----- ------ ---- --- ------ ----------------- - -- --------------------------- ----- ------- -- - -- ----- - ------------------- ------- - ------------------------------------ --------- ----------- --------------- --- ---
在这个例子中,我们使用 MongoClient
连接到 MongoDB 服务器,并向数据库 myproject
中的 users
集合插入了两个文档。要运行此代码,您需要安装 mongodb
模块:
npm install mongodb
结论
MongoDB Schema 的设计可以比较灵活和自由,但是好的 Schema 设计需要考虑多方面因素,包括数据结构、查询效率、数据一致性等等。
在设计 Schema 时,需遵循一些原则,如将关联数据放在一起、保持文档小而有结构等等。同时,使用 reference 而不是 embed、使用 sub-document 而不是多个字段、使用枚举值作为字符串等最佳实践也能帮助您设计出更好的 Schema。
最后,我们展示了一个使用 MongoDB 和 Node.js 的示例代码,以便您更好地理解 MongoDB Schema 的设计和使用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6731a0890bc820c5823982ce