7 个数据建模最佳实践

导航至

本文最初发表于 The New Stack,经许可在此转载。

虽然在小型项目中,您通常可以在没有太多计划的情况下侥幸过关,但在构建复杂的软件时,计划对于成功至关重要。而您最需要做对的事情可能就是应用程序的数据模型。

畅销书 Designing Data-Intensive Applications 一书为数据模型为何如此关键给出了充分的理由:“数据模型不仅对软件的编写方式,而且对我们思考要解决的问题的方式都具有深刻的影响。”

这句话触及了我们首先创建软件的根本原因:解决问题。而要正确地做到这一点,就需要了解用户和待解决问题的工程人员和业务人员之间的沟通。然后,软件工程师可以利用这些知识,将其转化为软件的数据模型,以帮助解决问题。

为什么数据建模很重要?

适当的 数据建模 需要时间,因此一个重要的问题可能是为什么它很重要并且值得付出所有努力?让我们来看看数据建模的一些直接和间接好处。

数据建模最明显的好处是,通过计划如何组织数据,您有能力提高性能、减少错误并降低设计错误和必须重写代码的可能性。所有这些加在一起意味着您从长远来看应该节省时间和金钱。

数据建模的一些次要好处是,最终结果应该使组织中每个人的数据分析更容易,这将有助于获得更好的见解,从而帮助您的业务。预先了解数据模型的另一个好处是,您可以为您的工作负载选择最佳类型的数据库,这将使您未来的生活更轻松,因为您不必担心扩展或性能问题。

数据建模最佳实践

1. 牢记业务目标

数据建模时最重要的事情是记住它与整体业务的关系。作为一名软件工程师,很容易忘记全局,因此请确保与业务分析师和任何其他相关的利益相关者合作,以确保数据模型反映现实。

2. 正确记录您的数据模型

如果没人知道如何使用,那么拥有世界上最好的数据模型也是毫无意义的。拥有完善的文档将使其他人了解系统中可用的数据,并使其更容易利用这些数据来生成有价值的见解。正确记录您的数据模型还将有助于更快地让新团队成员入职,并使未来维护或修改数据模型变得更容易,因为您可以通过文档获得数据模型当前状态的最新单一信息源。

3. 将您的数据模型设计为可随时间调整

您应该确保设计您的数据模型,使其可以轻松地进行更新和修改。首次尝试就成功的几率很小,即使您成功了,将来也会有变化,需要随着时间的推移添加新的数据类型。因此,从一开始就考虑到这一点将为您节省未来的痛苦。

4. 为不同的人提供不同级别的抽象

数据建模的标准过程分为 3 种类型:概念数据建模、逻辑数据建模和物理数据建模。这些层级都具有不同级别的抽象,这有助于即使是非技术用户也能理解数据模型。它还允许将技术决策与更高级别的概念数据模型隔离开来,在这些模型中不需要这种复杂性。以下是关于 3 种不同类型的数据建模的更多详细信息

  • 概念 - 在概念层面上,对象是根据业务本身以及它们的交互方式或任何相关的约束和业务规则来定义的。

  • 逻辑 - 在逻辑层面上,会为在数据建模的概念阶段确定的对象添加更多细节。逻辑数据模型通常包括每个对象应该具有哪些特定的数据类型和属性。

  • 物理 - 物理数据模型定义了存储数据的实际技术细节。这将包括数据库特定的实现细节。以关系数据库为例,物理模型将包括 SQL,用于创建表并为表中表示概念设计阶段定义的对象定义每列的数据类型。

5. 选择正确的数据建模技术

有许多不同的数据建模技术。您选择哪种技术应基于您正在处理的数据类型和工作负载类型。最简单的例子是您是为最终用户应用程序创建数据模型,还是为主要进行分析查询的数据分析师创建数据模型。

对于第一种情况,您可能希望选择关系数据建模,这是一种常见的选择。对于第二种情况,使用维度建模可能更有意义。每个决策都有权衡,关键是找出哪种数据模型提供的益处最多,而缺点可以通过您的用例的性质来缓解。

6. 考虑数据治理和安全性

近年来,数据隐私和安全已成为主要议题,并且已经出台了许多法规。作为数据建模过程的一部分,花时间考虑如何保护数据、谁可以访问数据以及您的整体数据治理策略也是有意义的。

7. 避免过早优化

虽然这个建议可能看起来与上面写的大部分内容背道而驰,但这里的想法是不要想得太多,以免减慢您的开发过程。收益递减是客观存在的,重要的是做出一些主要的正确决策,然后再进行迭代。另一个需要记住的是不要过度设计您的系统,保持尽可能简单,并在扩展系统成为问题时再担心扩展系统。

数据建模教程

现在让我们看一个实际的例子,说明如何进行数据建模。为了使其更有趣,我们将使用时间序列数据,因为这增加了一个在设计数据模型时需要考虑的复杂性。在本例中,我们将使用一个智能家居,它收集温度数据以自动打开和关闭空调,从而提高能源效率。

首先,让我们在概念层面上定义实体和关系。实体如下:

  • 家庭
  • 房间
  • 传感器
  • 温度
  • 能耗

这些实体之间的基本关系如下:

  • 一个家庭包含多个房间。
  • 每个房间包含一个或多个传感器。
  • 一个传感器生成多个温度读数。
  • 能耗与每个家庭相关联。

现在,作为时间序列数据带来的额外维度是如何定义实体之间随时间变化的数据的关系。在本例中,它将是温度和能耗。由于房间温度和能耗显然是相关的,因此这是可以在数据模型中定义的另一种关系类型。

对于时间序列数据,您可能希望将实体分解为不更改的静态实体(房间的名称)和随时间变化的实体(温度)。然后,您需要考虑如何为由此产生的不同类型的关系建模

  • 两个静态实体之间的关系(房间和家庭)

  • 随时间变化的实体和静态实体之间的关系(温度和房间)

  • 两个随时间变化的实体之间的关系(温度和能耗)

您的数据如何关联以及您的最终用户将查询哪些数据对您在物理数据建模级别如何索引数据具有重大影响,因此尽早考虑这一点对于项目的成功至关重要。如果您没有正确设置索引,因为您不了解用户的 data access 模式,性能将受到影响,用户将不满意。

有关数据建模的更多详细信息,请查看以下文章

下一步

数据建模是确保您从数据中获得最大价值的宝贵工具。遵循本文中介绍的最佳实践应该使您走上正确的道路,开始在您自己的项目中进行数据建模。

数据建模最有价值的方面之一是了解如何访问您的数据。一旦您知道了这一点,您就可以在物理模型方面做出正确的选择,即哪种数据库适合存储您的数据以优化成本和性能。例如,如果您正在处理时间序列数据,如应用程序指标、物联网传感器数据或实时分析,那么像 InfluxDB 这样的专用时间序列数据库可能是有意义的。如果您正在处理高度连接的数据,那么图数据库将是理想的选择。对于需要保证数据完整性的情况,具有 ACID 事务支持的关系数据库将是一个不错的选择。

这里的关键要点是,要做出明智的决策,您需要首先努力了解您的业务或应用程序生成的数据,而数据建模是该过程的关键部分。