MongoDB中的数据建模有何不同?

数据建模是开发可视化表示整个软件应用程序或其组件以传达数据点和结构之间的连接的过程。它涉及到仔细审查其应用程序和数据库要求,以及作为涉及核心数据操作(读,写和更新)两者之间的联系。

通过评估应用程序的使用模式并将数据库模式与其对齐,可以创建一个稳定的数据模型。因此,架构设计可以塑造您的数据模型。当涉及到关系数据库时,如果不创建表架构就无法填充表。

要知道的关键术语

在继续之前,您必须了解一些基本定义:

  • 集合–集合是MongoDB中的一组文档。它等效于RDBMS中的表。
  • 文档–文档是由文件和值对组成的结构。它等效于RDBMS中的一行。
  • 数据库架构–架构设计是为数据库管理系统(DBMS)设计的数据库的逻辑和可视化架构。

MongoDB中的数据建模有何不同?

由于NoSQL的灵活性,您无需在插入数据之前创建架构。这是因为MongoDB支持动态形式的数据库架构。这消除了预先设计架构的需要。相反,您现在可以存储数据并根据您的集合进行调整。

您可以在集合的给定字段中存储不同的数据类型,甚至可以添加新字段,更新字段值以及删除现有字段。当您将文档映射到对象或实体时,您会发现这种灵活性的真正好处。

通常,集合及其文档遵循类似的结构。您还可以通过使用架构验证来“强制”集合文档的验证规则。

相关:下一个项目要考虑的数据库引擎

创建数据模型时,请研究您的应用程序将如何与数据库交互。例如,如果要处理最近插入的文档,则最好使用上限集合-具有固定大小的集合,支持高吞吐量操作。

同样,如果您的应用程序大多数时候都将使用读取操作,则可以设置索引以支持常见查询并提高性能。

传统上,创建数据模型的考虑因素之一是如何存储相关数据。关系数据库使用表来存储数据,其中主键和外键用于设置数据关系。

同样,联接用于访问和运行多个表上的操作。作为从关系型DBMS(例如SQL Server)切换到MongoDB的人,您将不会在MongoDB中找到联接。这是因为MongoDB通过引用数据或将数据嵌入到集合中来存储集合数据。

因此,如果您的数据模型在一个关系数据库中使用十个表,则MongoDB可能会将您将其合并到一个集合中。

数据模型类型

现在您知道了数据建模在MongoDB中的工作方式,让我们看一下MongoDB支持的数据模型的类型。通常,它取决于文档的结构和应用程序的数据关系。

嵌入式数据模型

您可以将数据嵌入到MongoDB中的单个文档或结构中。它也被称为非规范化数据模型,它充分利用了MongoDB丰富文档的全部潜力。例如,考虑以下示例:我们有一个学生集合其中包含文档Matt。在本文档中,我们嵌入了两个文档,联系方式等级

 {
"_id": "4aad66a4c13bb24f12gh199e",
name: “Matt”,
contact details: {
phone:”555-555-1234”
email address: “[email protected]
},
grade: {
subject: “CS101”
score: “B”
}}

嵌入将相关详细信息存储在同一文档或数据库记录中。这样,您可以最大程度地减少执行常见数据库操作所需的查询和更新。

什么时候应该使用嵌入式数据模型?它们对于提高读取操作的性能很有用。另外,它们对于处理单个记录的数据检索也是有效的。使用此模型,您可以使用单个写入操作来更新相关数据。

但是,您需要记住一些事项:嵌入会在创建文档后增加其大小。在某些情况下,这可能会影响写入性能,并且由于文档大小的扩展,还可能会出现数据碎片的情况。

最后,您可以使用点符号与嵌入式文档进行交互,并轻松地遍历它们。语法如下:

 field.nestedField:value

对于上面的示例,您可以通过编写以下查询来访问嵌套文档:

 db.students.find({contact details: { phone:”555-555-1234” ,email address: “[email protected]”}}).pretty()

规范化数据模型(参考)

规范化的数据模型用于构建一对多和多对多关系模型。在使用嵌入式文档模型时,有时需要重复数据。这是引用派上用场的地方–它们解决了冗余问题。这是我们如何在上面的示例中使用引用的方法。

我们已将单个文档分为三个文档,并且由于联系方式等级具有Matt文档的ID,因此您可以在需要时调用它们。

 student
{
_id:<ObjectId1>
username: “Matt”
}
contact details
{
_id:<ObjectID2>
user_id: <ObjectId1>
email:“[email protected]
phone:”555-555-1234”
}
grade
id:<ObjectId3>
user_id: <ObjectId1>,
subject: “CS101”,
score: “B”
}

如您所见,规范化数据模型通过使用较新集合之间的引用将数据分成多个集合。您可以更新一个文档,这将更新其他集合。这是一种更新数据的有效方法,通常在数据频繁更改时使用。

在以下情况下,规范化数据模型是更明智的选择:

  • 您必须对遵循特定层次结构的大型数据集进行建模。
  • 您必须代表多个多对多关系。
  • 嵌入会导致数据重复,而不会充分受益于您的读取性能。

现在,您可以轻松地在MongoDB中对数据建模

到目前为止,您已经知道MongoDB中的数据建模与关系型DBM有何不同,尤其是在架构方面。您还了解了MongoDB中数据模型的类型(去规范化和规范化),并了解何时使用它们。

而这仅仅是个开始;还有更多有关MongoDB如何组织数据的信息。