MongoDB schema 设计最佳实践

阅读时长 6 分钟读完

MongoDB 是一种 NoSQL 数据库,与传统的关系型数据库相比,MongoDB 的 schema 设计更加灵活和自由。

但是,灵活与自由并不意味着没有规律可循,好的 schema 设计需要考虑多方面因素,包括数据结构、查询效率、数据一致性等等。

本文将从原则、实践和示例等方面,介绍 MongoDB Schema 的最佳实践。

原则

在设计 MongoDB Schema 时,有几个原则需要遵循:

  1. 将关联数据放在一起。与关系型数据库不同,MongoDB 不支持多表 join,因此需要将相关数据尽可能地放在一个文档中。

  2. 保持文档小而有结构。MongoDB 的优点之一是文档的结构可以比较自由,但是过于自由会导致文档过大,特别是嵌套层数过深的文档。因此,需要在自由度和结构化之间寻找平衡。

  3. 尽量避免使用多态。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 的文档结构是自由的,但查询效率很大程度上受到数据类型的影响。如果将字符串作为枚举值使用,可以使查询结果更加精确。

例如,在一个论坛应用程序中,可以使用枚举值将帖子分类:

在这个例子中,category 字段只有少数几个可选值,可以使用字符串作为枚举值来表示。

示例代码

下面是一个使用 MongoDB 的 Node.js 示例代码,用于向数据库中插入一些文档:

-- -------------------- ---- -------
----- ----------- - -------------------------------

----- --- - --------------------------------------
----- ------ - --- ---------------- ----------------- -------

-------------------- -- -
  -- ----- -
    -------------------
    -------
  -
  ---------------------- -- ----------

  ----- -- - -----------------------
  ----- ---------- - -----------------------

  ----- ---- - -
    -
      ---- --------
      ----- --------
      ---- ---
      ------ -------------------
    --
    -
      ---- --------
      ----- ------
      ---- ---
      ------ -----------------
    -
  --

  --------------------------- ----- ------- -- -
    -- ----- -
      -------------------
      -------
    -
    ------------------------------------ --------- -----------
    ---------------
  ---
---

在这个例子中,我们使用 MongoClient 连接到 MongoDB 服务器,并向数据库 myproject 中的 users 集合插入了两个文档。要运行此代码,您需要安装 mongodb 模块:

结论

MongoDB Schema 的设计可以比较灵活和自由,但是好的 Schema 设计需要考虑多方面因素,包括数据结构、查询效率、数据一致性等等。

在设计 Schema 时,需遵循一些原则,如将关联数据放在一起、保持文档小而有结构等等。同时,使用 reference 而不是 embed、使用 sub-document 而不是多个字段、使用枚举值作为字符串等最佳实践也能帮助您设计出更好的 Schema。

最后,我们展示了一个使用 MongoDB 和 Node.js 的示例代码,以便您更好地理解 MongoDB Schema 的设计和使用。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6731a0890bc820c5823982ce

纠错
反馈