建模:从关系模型到图模型
对于拥有关系型数据建模背景的人员,本指南旨在帮助您将现有的关系型数据建模过程和组件知识迁移到图数据建模中。它将对比两种过程的步骤,并帮助您识别这两种数据库类型在数据建模上的异同。
简介
如果您熟悉包含表、列、关系基数及其他组件的关系型数据模型,那么图数据建模对您来说并不会感到完全陌生。数据模型的设计仍然需要基于访问需求、查询、性能预期和业务逻辑。然而,图数据模型的结构布局方式略有不同。
您可能有一个全新的项目需要创建图数据模型,但只熟悉如何创建关系模型。或者,您可能已经有一个现有的关系模型项目,想要将其转换为图模型。无论哪种情况,本指南都将利用您现有的关系数据模型知识,展示如何将其用于创建图模型。
关系型与图架构
快速概览一下,请记住关系型数据库依赖索引查找和表连接(Join)来关联不同的实体。当连接多个表、表中有数百万行数据,或者复杂的查询需要跨多个层级进行子查询时,这很快就会演变成性能问题。
在我们概念页面的示例中,要找出 Alice 工作的部门,您需要查询 Person 表以找到代表 Alice 的行(通过唯一 ID 作为主键关联)。然后,您的查询将进入关联实体表(Person_Dept)以找到她的 ID 与哪些部门 ID 相连。最后,查询将检查 Department 表以获取您在关联实体表中找到的那些部门 ID 的实际值。
下图回顾了我们刚刚描述的这个示例。
在图中,您不必担心表连接和索引查找,因为图数据是根据每个单独的实体及其与其他个体的关系来构建的。
好了,那么我们该如何从创建关系型数据模型过渡到图数据模型呢?
数据模型转换技巧
让我们看看关系型数据模型中的一些关键组件,并将它们转换为图数据模型的组件。帮助您转换关系图的步骤列出如下。
-
表转节点标签 (Table to Node Label) - 关系模型中的每个实体表都会成为图模型中节点的标签。
-
行转节点 (Row to Node) - 关系实体表中的每一行都会成为图中的一个节点。
-
列转节点属性 (Column to Node Property) - 关系表上的列(字段)会成为图中的节点属性。
-
仅保留业务主键 (Business primary keys only) - 删除技术主键,保留业务主键。
-
添加约束/索引 (Add Constraints/Indexes) - 为业务主键添加唯一约束,为频繁查找的属性添加索引。
-
外键转关系 (Foreign keys to Relationships) - 用关系替换指向其他表的外键,之后将其移除。
-
无默认值 (No defaults) - 移除带有默认值的数据,无需存储这些值。
-
清理数据 (Clean up data) - 非规范化表中的重复数据可能需要提取到独立的节点中,以获得更简洁的模型。
-
索引列转数组 (Index Columns to Array) - 索引列名(如 email1, email2, email3)可能暗示了一个数组属性。
-
连接表转关系 (Join tables to Relationships) - 连接表被转换为关系,这些表上的列成为关系属性。
如果您将上述列表中的项目应用于我们查找 Alice 部门的示例,我们可以得到如下图所示的图结构。
尽管这两个模型在通过表结构或标签来分类数据方面有相似之处,但图模型并不将数据局限于预定义的、严格的表/列布局中。我们将在下一节中看另一个示例。
组织领域数据模型
为了让我们有更多练习机会,我们将使用一个标准的组织领域,并展示它在关系型数据库与图数据库中分别是如何建模的。为了增加挑战,请尝试自己创建图数据模型,然后看看它与示例的吻合度。
转换步骤
首先,我们可以通过颜色将表分类为主要领域表和关联实体表。然后,我们可以将表名转换为节点标签。在这种情况下,Project、Person、Department 和 Organization 成为了我们图模型中的标签。
表中的行成为它们自己的节点,这些行中的列成为这些节点上的属性。例如,您在 Person 表中的行将成为一个节点,您的姓名和出生日期将作为属性存储在该节点上。任何允许存储多个相似值的索引列都将成为一个数组(例如 skill1、skill2、skill3 列转换为存储在节点数组属性中的三个值)。
如果有任何技术主键(即仅仅为了使行唯一而创建的主键,例如为了区分标题相同的多个项目而设置的 project_id),请删除它们,只保留业务需求所需的属性。您还需要为业务主键添加唯一约束,以确保数据库不允许出现重复项。
有助于关系型连接查找的外键被转换为关系,因为它们展示了节点之间的链接。连接表(或关联实体表)也转换为关系,原连接表中的列则移动到关系属性中。
由于您在 Neo4j 中仅存储所需的属性,因此无需存储 NULL 值或空值,您可以移除关系模型中可能创建的任何默认值。
最后,为了规范化表或为了简化而创建的任何重复数据都需要删除,因为在图中这些是多余的。
经过这个过程,您的图数据模型应该看起来如下图所示。
在开始导入数据之前,对图模型有一个基本的理解非常重要,因为这样在后续需求变化时,更容易填充或调整该模型。在接下来的指南中,我们将探讨图数据的建模方式如何影响查询、性能和模型变更。