建模:从关系型到图型

对于有关系型数据建模背景的用户,本指南可帮助您将现有的关系型数据建模过程和组件知识迁移到图数据建模中。它将帮助您比较和对比每种过程的步骤,并帮助您识别不同类型数据库的数据建模相似之处或不同之处。

简介

如果您熟悉包含表、列、关系基数及其他组件的关系型数据模型,那么图数据建模对您来说将不会完全陌生。数据模型的设计仍需基于访问、查询、性能预期和业务逻辑的要求。然而,图数据模型的结构布局略有不同。

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

关系型与图型架构

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

在我们概念页的示例中,要查找 Alice 所在部门,您需要查询 Person 表以找到代表 Alice 的行,该行与一个唯一 ID(作为主键)绑定。然后,您的查询将转到关联实体表(Person_Dept),查找其 ID 与一个或多个部门 ID 关联的地方。最后,查询将检查 Department 表,以找到您在关联实体表中找到的那些部门 ID 的实际值。

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

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

那么,我们如何从创建关系型数据模型转向图数据模型呢?

数据模型转换技巧

让我们来看看关系型数据模型中的一些关键组件,并将其转换为图数据模型的组件。以下列出了帮助您转换关系图的步骤。

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

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

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

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

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

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

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

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

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

  • 连接表到关系 - 连接表被转换为关系,这些表上的列成为关系属性。

如果您将上述列表中的项应用于我们查找 Alice 部门的示例,我们可以得到如下图所示的图。

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

组织领域数据模型

为了给我们另一次练习机会,我们将使用一个标准组织领域,并展示它在关系型数据库和图数据库中将如何建模。为了给自己一个额外的挑战,请尝试自行创建图数据模型,然后看看它与示例的匹配程度。

转换步骤

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

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

如果存在任何技术主键(换句话说,仅为使行唯一而创建的主键——例如在有多个同名项目时的 project_id),则移除这些主键,只保留业务需求所需的属性。您还需要为业务主键添加唯一约束,以确保数据库不允许重复。

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

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

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

完成此过程后,您的图数据模型应如下图所示。

在开始导入数据之前,对图模型有一个基本了解非常重要,因为这样可以在需求变化时更轻松地填充或调整该模型。在即将发布的指南中,您如何建模图数据会影响查询、性能和模型更改。

© . All rights reserved.