建模:关系型到图数据库

对于那些有关系型数据建模背景的人来说,本指南有助于将您对关系型数据建模所用流程和组件的现有知识迁移到图数据建模中。它将有助于比较和对比每个流程的步骤,并帮助您识别每种类型数据库的数据建模在哪些方面相似或不同。

简介

如果您熟悉使用表、列、关系基数和其他组件的关系型数据模型,那么图数据建模不会显得完全陌生。数据模型的设计仍然需要基于访问、查询、性能预期和业务逻辑的要求。但是,图数据模型的结构略有不同。

您可能有一个全新的项目,想要创建一个图数据模型,但只熟悉如何创建关系型模型。或者,您可能已经有一个现有的项目,其关系型模型您想要转换为图模型。无论哪种情况,本指南都会利用您对关系型数据模型的现有知识,并向您展示如何使用它来创建图模型。

关系型和图数据库架构

简单概述一下,请记住,关系型数据库依赖于索引查找和表连接来连接不同的实体。这很快会成为性能问题,尤其是在连接多个表、表上有数百万行或复杂查询遍历各种级别的子查询时。

在我们概念页面的示例中,要查找爱丽丝所属的部门,您需要查询 Person 表来查找代表爱丽丝的行,该行与作为主键的唯一 ID 绑定。然后,您的查询会转到关联实体表 (Person_Dept) 来查找她的 ID 与一个或多个部门 ID 的绑定位置。最后,查询会检查 Department 表来查找您在关联实体表中找到的那些部门 ID 的实际值。

下图回顾了我们刚刚描述的示例。

在图数据库中,您无需担心表连接和索引查找,因为图数据是通过每个单独的实体及其与其他单独实体的关系来构建的。

好的,那么我们如何从创建关系型数据模型过渡到图数据模型呢?

数据模型转换技巧

让我们看看关系型数据模型中的关键组件,并将它们转换为图数据模型的组件。以下是帮助您进行关系型图转换的步骤。

  • 表到节点标签 - 关系型模型中的每个实体表都成为图模型中节点上的一个标签。

  • 行到节点 - 关系型实体表中的每一行都成为一个节点。

  • 列到节点属性 - 关系型表上的列(字段)成为图数据库中的节点属性。

  • 仅保留业务主键 - 删除技术主键,保留业务主键。

  • 添加约束/索引 - 为业务主键添加唯一约束,为频繁查找属性添加索引。

  • 外键到关系 - 将指向其他表的**外键**替换为**关系**,然后删除外键。

  • 无默认值 - 删除具有默认值的数据,无需存储这些数据。

  • 清理数据 - 规范化表中的重复数据可能需要提取到单独的节点中,以获得更清晰的模型。

  • 索引列到数组 - 索引列名(如 email1、email2、email3)可能表示一个数组属性。

  • 联接表到关系 - 联接表转换为关系,联接表上的列成为关系属性

如果将上述列表中的内容应用于我们的示例查找爱丽丝的部门,我们可以得到如下所示的图。

尽管这两个模型有相似之处,例如使用表结构或标签对数据进行分类,但图模型不会将数据限制在预定义且严格的表/列布局中。我们将在下一节中查看另一个示例。

组织域数据模型

为了再次练习,我们将使用标准的组织域,并展示它在关系型数据库和图数据库中的建模方式。为了给自己更大的挑战,尝试自己创建图数据模型,然后看看它与我们的模型有多接近。

转换步骤

首先,我们可以通过颜色将表分类为主要域表和关联实体表。然后,我们可以将表名转换为节点标签。在本例中,ProjectPersonDepartmentOrganization 成为图模型中的标签。

表上的行成为它们自己的节点,行中的列成为这些节点上的属性。例如,您在 Person 表上的行将成为一个节点,您的姓名和出生日期作为节点上的属性。允许多个相似值的任何索引列将成为数组(例如,skill1、skill2、skill3 列转换为存储在节点上的数组属性中的三个值)。

如果存在任何技术主键(换句话说,仅仅为了使行唯一而创建的主键 - 例如,如果有多个具有相同标题的项目,则使用 project_id),那么删除它们,只保留业务需求所需的属性。您还需要为业务主键添加唯一约束,以确保数据库不允许重复。

有助于关系型连接查找的外键被转换为关系,因为它们显示了节点之间的链接。联接表(或关联实体表)也成为关系,联接表上的任何列都移动到关系属性中。

由于您只在 Neo4j 中存储所需的属性,因此您无需存储空值和空值,因此可以删除可能在关系型模型中创建的任何默认值。

最后,为了规范化表格或为了简化而创建的任何重复数据都需要删除,因为它们在图中是不必要的。

经过此过程后,您的图数据模型应该类似于下面的图像。

在开始导入数据之前,了解图模型的基本知识非常重要,因为这样在以后根据需要更改模型时,更容易填充模型或调整模型。 在即将发布的指南中,您如何对图数据进行建模会影响查询、性能和模型更改。