一次Postgres的实体表重构经历

前言

当谈及重构时,人们往往更多地聚焦于代码层面的改进,而较少关注数据库中实体表的重构。这主要是因为,相较于代码重构,实体表的重构对系统的冲击与影响更为深远。实体表的重构不仅涉及范围更广,而且带来的心智负担和风险也相对较高。因此,在庞大而复杂的系统中,进行实体表重构的决策往往更为谨慎。

然而,当数据出现冗余、不一致或业务发生变更时,我们就必须认真考虑对实体表进行重构了。

故事场景

在最近的一次项目中,我面临了一个挑战:将一个复杂的表拆分为三个更简洁、更规范的表,以满足数据库设计的第三范式。出于保密考虑,我无法展示具体的代码细节,但我会详细分享这次拆分过程中的实践经验。

在这个过程中,我充分利用了PostgreSQL的DISTINCT ON特性。这是一个非常强大的工具,尤其在处理包含多个重复值的复杂查询时。通过它,我能够轻松地提炼出主表中的唯一记录。

DISTINCT ON的语法如下:

SELECT DISTINCT ON (expression [, ...]) * | output_expression [, ...]    
FROM table_name [WHERE condition]    
[ORDER BY sort_expression [, ...]]

在这个语法中,expression代表你希望基于其选择唯一记录的列或列组合,而output_expression则代表你希望从查询结果中选择的列。

需要特别注意的是,SELECT DISTINCT ON是PostgreSQL特有的功能。如果你尝试在其他数据库系统中使用它,可能会遇到语法错误或不支持的情况。当然,为了写出更具兼容性的SQL代码,我们可能需要增加一些额外的逻辑和复杂度。

其他关注点

  1. 数据备份:在进行任何数据库重构操作之前,务必进行完整的数据备份。这是防止数据丢失或损坏的最基本也是最重要的步骤。
  2. 数据验证:在拆分完成后,我们需要对拆分前后的数据进行详细对比和验证,确保数据的完整性和一致性没有受到任何影响。
  3. 相关组件调整:除了表本身的重构外,还需要对与之相关的视图、触发器以及存储过程进行相应的调整和优化,以确保整个系统的顺畅运行。
  4. 可靠性演练SELECT DISTINCT ON可能会对系统资源造成压力,这取决于数据量和查询复杂度。肯能我们在开发环境中能够顺利升级,但是到了生产环境后会造成系统崩溃。

总结

通过这次实践,我深刻体会到了数据库实体表重构的重要性和挑战性。这个过程要谨慎操作,步步为营,多做接近于用户场景的测试,一定不要造成数据丢失(注意,是一定不要,因为一旦造成数据丢失,不但造成的影响很大,找回数据的成本也是很高昂的)。

每一次困境,对我们来说都是一次成长的机会,这次也不会例外。

2024.3.31

重庆,渝北

相关推荐

  1. Postgres实体重构经历

    2024-04-04 07:54:04       15 阅读
  2. 有趣经历分享

    2024-04-04 07:54:04       40 阅读
  3. 面试经历

    2024-04-04 07:54:04       23 阅读
  4. 压测经验过程经验记录

    2024-04-04 07:54:04       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-04 07:54:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-04 07:54:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-04 07:54:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-04 07:54:04       18 阅读

热门阅读

  1. 走近Shiro--一起学习吧之架构

    2024-04-04 07:54:04       13 阅读
  2. 速盾:服务器有cdn 带宽上限建议多少

    2024-04-04 07:54:04       16 阅读
  3. Go实现MapReduce

    2024-04-04 07:54:04       14 阅读
  4. Spark面试整理-讨论DataFrame和DataSet的区别

    2024-04-04 07:54:04       14 阅读
  5. 文心一言 vs GPT-4 —— 全面横向比较

    2024-04-04 07:54:04       15 阅读
  6. MySQL数据库归档工具之【pt-archiver】

    2024-04-04 07:54:04       14 阅读
  7. 在Ubuntu 18.04上如何添加交换空间

    2024-04-04 07:54:04       14 阅读
  8. 人生感悟

    2024-04-04 07:54:04       10 阅读
  9. 【python】Google 风格和 Numpy 风格 docstring

    2024-04-04 07:54:04       16 阅读
  10. List Set Map 的值能否为NUll?

    2024-04-04 07:54:04       11 阅读
  11. 2024水会|全国水科技大会第一版日程正式公布

    2024-04-04 07:54:04       14 阅读