4.1. MongoDB 数据建模入门

参考:https://docs.mongodb.com/guides/server/introduction/#what-you-ll-need

(一)定义数据集

当需要建立数据存储时,首先应该思考以下问题:需要存储哪些数据?这些字段之间如何关联?这是一个数据建模的过程。目标是将业务需求抽象为逻辑模型 。假设这样一个场景:我们需要建立数据库以跟踪物料及其数量,大小,标签和等级。如果是存储在 RDBMS,可能以下的数据表:

name quantity size status tags rating
journal 25 14x21,cm A brown, lined 9
notebook 50 8.5x11,in A college-ruled,perforated 8
paper 100 8.5x11,in D watercolor 10
planner 75 22.85x30,cm D 2019 10
postcard 45 10x,cm D double-sided,white 2

(二)思考 JSON 结构

从上例中可以看出,表似乎是存储数据的好地方,但该数据集中的字段需要多个值,如果在单个列中建模,则不容易搜索或显示(对于 例如–大小和标签)。在 SQL 数据库中,您可以通过创建关系表来解决此问题。在 MongoDB 中,数据存储为文档(document)。 这些文档以 JSON(JavaScript 对象表示法)格式存储在 MongoDB 中。 JSON 文档支持嵌入式字段,因此相关数据和数据列表可以与文档一起存储,而不是与外部表一起存储。JSON 格式为键/值对。 在 JSON 文档中,字段名和值用冒号分隔,字段名和值对用逗号分隔,并且字段集封装在“大括号”({})中。如果要开始对上面的行之一进行建模,例如此行:

name quantity size status tags rating
notebook 50 8.5x11,in A college-ruled,perforated 8

您可以从 name 和 quantity 字段开始。 在 JSON 中,这些字段如下所示:

{ "name": "notebook", "qty": 50 }

(三)确定哪些字段作为嵌入式数据

接下来,需要确定哪些字段可能需要多个值。可以考虑将这些字段作为嵌入式文档或嵌入式文档中的 列表/数组 对象。例如,在上面的示例中,size 可能包含三个字段:

{ "h": 11, "w": 8.5, "uom": "in" }

And some items have multiple ratings, so ratings might be represented as a list of documents containing the field scores:

[{ "score": 8 }, { "score": 9 }]

And you might need to handle multiple tags per item. So you might store them in a list too.

["college-ruled", "perforated"]

Finally, a JSON document that stores an inventory item might look like this:

{
  "name": "notebook",
  "qty": 50,
  "rating": [{ "score": 8 }, { "score": 9 }],
  "size": { "height": 11, "width": 8.5, "unit": "in" },
  "status": "A",
  "tags": ["college-ruled", "perforated"]
}

This looks very different from the tabular data structure you started with in Step 1.

下一节:数据建模中的关键挑战是平衡应用程序的需求、数据库引擎的性能以及数据检索模式。 在设计数据模型时,始终需要考虑数据的应用程序使用情况(即数据的查询,更新和处理)以及数据本身的固有结构。