7个数据建模最佳实践
作者:Charles Mahler / 开发者,用例
2023年8月4日
导航至
本文最初发表在The New Stack上,在此得到授权转载。
虽然在小项目中您可能无需过多规划就能完成,但在构建复杂软件时,成功的秘诀就是正确的设计应用程序的数据模型。
畅销书《设计数据密集型应用程序》给出了数据模型为何如此关键的有力理由:“数据模型不仅对软件的编写方式,而且对我们思考要解决的问题的方式产生深远的影响。”
这句话触及了我们制作软件的根本原因:解决问题。而要正确地做到这一点,需要工程人员和业务人员之间的沟通,他们了解用户和正在解决的问题。在此基础上,软件工程师可以利用这些知识,并通过转换将其转化为软件的数据模型,以帮助解决问题。
数据建模为什么重要?
正确的数据建模需要花费时间,因此一个重要的问题可能是为什么它很重要,值得付出所有努力?让我们来看看数据建模的一些直接和间接的好处。
数据建模最明显的益处是,通过规划如何组织你的数据,你有能力提高性能、减少错误并降低设计错误和需要重写代码的可能性。所有这些加在一起意味着你最终可以节省时间和金钱。
数据建模的一些次要益处包括:最终结果应该使组织中的每个人都更容易进行数据分析,这将有助于你的业务。另一个好处是,提前了解你的数据模型,你可以选择最适合你工作负载的数据库类型,这将使你的未来生活更容易,因为你不必担心扩展或性能问题。
数据建模最佳实践
1. 考虑业务目标
数据建模最重要的方法是记住它与整体业务的关系。作为一名软件工程师,很容易忘记大局,所以请确保你与业务分析师和其他相关利益相关者合作,以确保数据模型反映现实。
2. 正确记录你的数据模型
即使拥有世界上最好的数据模型,如果没有人知道如何使用它也是毫无意义的。建立坚实的文档将使其他人知道系统中可用的数据,并使其更容易利用这些数据来生成有价值的见解。你的数据模型正确记录还将有助于更快地吸纳新团队成员,并在未来更容易维护或修改数据模型,因为你通过文档有一个关于当前数据模型状态的最新单一来源的真相。
3. 设计你的数据模型以适应时间变化
你应该确保你的数据模型可以被更新和修改,而无需太多的困难。第一次就完美解决问题的可能性很小,即使你做到了,未来也可能会发生变化,需要添加新的数据类型。因此,从一开始就考虑这一点将有助于你在未来避免痛苦。
4. 为不同的人提供不同级别的抽象
数据建模的标准流程分为3种类型:概念、逻辑和物理数据建模。这些层级都有不同的抽象级别,这有助于使即使是非技术用户也能理解数据模型。它还允许将技术决策从更高层次的概念数据模型中隔离出来,在那里这种复杂性是不必要的。以下是关于三种不同类型数据模型的更多细节。
-
概念性 - 在概念层面上,对象是根据业务本身以及它们如何交互、相关约束和业务规则来定义的。
-
逻辑性 - 在逻辑层面上,为在数据建模的概念阶段确定的对象添加更多细节。逻辑数据模型通常包括每个对象应具有的具体数据类型和属性。
-
物理性 - 物理数据模型定义了存储数据的实际技术细节。这将包括特定数据库的实现细节。以关系型数据库为例,物理模型将包括创建表和定义在表示概念设计阶段定义的对象的表的每列数据类型的SQL语句。
5. 选择合适的数据建模技术
有许多不同的数据建模技术。您选择哪一种应基于您正在处理的数据类型和工作负载类型。最简单的例子是您是否正在为终端用户应用程序创建数据模型,或者为将进行大量分析查询的数据分析师创建数据模型。
对于第一种情况,您可能想选择关系型数据建模,这是一个常见的选择。对于第二种情况,使用维度建模可能更有意义。每个决策都有其权衡之处,关键是找出哪种数据模型在您的用例特性中提供了最大的好处,同时将缺点降到最低。
6. 考虑数据治理和安全
近年来,数据隐私和安全已成为重要议题,许多法规也相继出台。在您的数据建模过程中,考虑如何保护数据、谁将有权访问数据以及整体的数据治理策略是有意义的。
7. 避免过早优化
尽管这些建议可能看似与上述许多内容相矛盾,但这里的想法是不过度思考事情,以免减缓您的开发过程。边际效益是存在的,重要的是做出一些重大决策,然后进行迭代。另一件需要记住的事情是不要过度设计您的系统,尽量保持简单,当出现问题时再考虑扩展您的系统。
数据建模教程
现在让我们通过一个实际例子来看看如何进行数据建模。为了使它更有趣,我们将使用时间序列数据,因为这将增加另一个复杂性,需要在设计数据模型时考虑。在这个例子中,我们将使用一个智能家居,它收集温度数据来自动开启和关闭空调以提高能源效率。
首先,让我们在概念层面上定义实体和关系。实体如下:
- 家庭
- 房间
- 传感器
- 温度
- 能源消耗
这些实体之间的基本关系如下:
- 一个家庭包含多个房间。
- 每个房间包含一个或多个传感器。
- 传感器生成多个温度读数。
- 能源消耗与每个家庭相关联。
由于这是时间序列数据,因此额外的一个维度是定义随时间变化的数据实体之间的关系。在这种情况下,将是温度和能源消耗。由于房间温度和能源消耗显然是相关的,这将是数据模型中可以定义的另一种关系类型。
在时间序列数据中,你可能需要将实体分解为静态实体(如房间名称)和时变实体(如温度),这些实体会发生变化。然后你需要考虑如何构建由此产生的不同类型的关系。
-
两个静态实体之间的关系(房间和家庭)
-
时变实体与静态实体之间的关系(温度和房间)
-
两个时变实体之间的关系(温度和能耗)
你的数据如何相互关联以及你的最终用户将查询哪些数据,将对你在数据建模的物理级别如何索引数据产生重大影响,因此,在项目早期就考虑这一点对于项目的成功至关重要。如果你因为不了解用户的数据访问模式而没有正确设置索引,性能将受到影响,用户也不会满意。
有关数据建模的更多详细信息,请参阅以下文章
下一步
数据建模是确保你能从数据中获得最大价值的宝贵工具。遵循本文中介绍的最佳实践,应该能让你在自己的项目中开始数据建模的正确路径。
数据建模最有价值的方面之一是了解你的数据如何被访问。一旦你知道了这一点,你就可以在物理模型方面做出正确的选择,例如,选择哪种数据库来存储你的数据以优化成本和性能。例如,如果你正在处理时间序列数据,如应用指标、物联网传感器数据或实时分析,则可能需要使用专门的时序数据库,如InfluxDB。如果你处理的是高度关联的数据,则图数据库将是理想的选择。对于需要保证数据完整性的情况,具有ACID事务支持的关系数据库将是一个不错的选择。
这里的关键是,为了做出明智的决策,你需要首先投入工作来了解业务或应用程序生成的数据,而数据建模是这一过程的关键部分。