RDBMS与混合设计范式

文章目录
最开始学数据库系统课程的时候,接触的都是普通的关系型数据库。关系型数据库的表结构(scheme)定义是先于数据存储的,这也就意味着数据项的结构(即数据项内部包含的数据元素,映射为数据库的列)发生改变,则需要整体调节表结构。在面向对象程序设计中,一张数据库中的表对应着一个类,即每一行能实例化为一个对象。频繁的表结构改变将给数据维护带来很大麻烦,包括但不限于以下问题及风险:
  • 性能开销的增加。改变表结构某些情况下会导致索引重建,索引重建又有可能引发雪崩
  • 数据丢失的风险。由于易失性普遍存在于存储变更及数据转换过程中,表结构的改变对数据完整性造成威胁
  • 编码效率下降。

这就引申出一个问题,如何在不改变表结构的条件下,改变存储的数据项。这个问题在2019年利用flask实现第一个web项目的时候就想到了,直到后来系统地学习过数据结构和数据库系统这两门课程以后,才开始以更专业的视角审视这个问题。在数据库层面可以选择非关系型数据库(例如mongoDB),这就摆脱了“必须先设计模式再存数据”这个限制。这个思路在实现实验室的科研项目时使用过,存在最主要的问题是外键限制不完善:id引用需要多轮查询,全引用不能动态更新。其次序列化与反序列化工具链在各种编程语言中不成熟。

在做智慧党建项目的时候,这个问题更加凸显。在长期实践中我的做法是,将一部分重要的、很难改变的字段固定入数据库模式设计中,其余信息组织放入一个额外字段中。组织这些其余信息的方式就是利用JSON格式,保持数据项之间的相对关系。由于很多数据库现在已经支持json字段,因而这是一种可行的做法。

常见的小项目中,多使用MySQL数据库,但是直到5.7版本才完整支持此类型,在此之前的版本只能使用text字段存储json串。如果使用text字段存储串,就无法在此字段上构建索引,这也就不支持高级检索方式。实际上直到8.0版本,在json字段上的高级索引功能也不如PostgreSQL做得好,因此十分建议使用混杂设计模式的应用切换到使用PostgreSQL数据库。

在PostgreSQL数据库中,定义json字段一共有两种类型,其中json类型是为了兼容,而jsonb类型支持的高级索引功能更多。一般来说,如果需要使用json类型,则定义为jsonb就足够了。关于在此字段上的高级检索方式,可以参考PostgreSQL官方文档。值得注意的是,如果在此基础上开发web应用,则SQLAlchemy框架提供了非常好用的orm映射,基本上完整地支持上述检索中使用的运算符。

本文作者:MyTech::Author

本文链接: https://mytech.pages.dev/2022/02/19/echo_416/