【AICon】 如何构建高效的 RAG 系统?RAG 技术在实际应用中遇到的挑战及应对策略?>>> 了解详情
写点什么

用 PostgreSQL 设计可靠的数据库

  • 2013-03-08
  • 本文字数:1388 字

    阅读完需:约 5 分钟

Chris Travers 最近发表了一系列题为“建设符合 SOLID 原则的数据库”的文章。他解释了如何运用一些常见的 OOP 原则(如单一责任原则、接口隔离、依赖反转)去改进数据模型和数据库代码的一些想法。尽管其中的一些想法可以在某种程度上应用到任何一种关系型数据库上,但文章列举的场景涉及到了对象关系特性(如表继承),只有类似 PostgreSQL 的数据库才有这些特性。

单一职责和标准化方面,Chris 解释了数据模型和类模型之间的相同点以及细微的差异。在纯粹的关系型数据库中,标准化通常可以完全满足单一职责原则(SRP),然而,表继承可进一步用来管理通常一起出现的字段,这些字段依赖数据库中的其他字段。他举了一个例子:

对于管理备注来说,其构成方式【译者注,即备注相关表及其表结构】也会有很大差异。人们可能想在数据库里的各种数据上添加备注,因此,任何人都不能说备注的内容或主题是具有依赖性的。

有两种典型的处理纯关系型的方法,一是可以持有很多独立管理的备注表,另外也可以创建一张单独的全局备注表,用这张表保存所有备注,然通过多表关联来建立依赖关系。

对象关系型处理方法可以持有多张备注表,并让它们继承公共备注表的表结构。

开放 / 封闭原则的目标是保持系统的可扩展性,当基线版本变更时会无故破坏系统的可扩展性。表继承则以灵活的方式为数据模型提供可扩展点。——举例来说,pg_message_queue 0.2 能够处理各种数据类型,它有一张单独的且可支持每种数据类型的表,可以从这张公共表去做所有的继承。Chris 另外还列举了一个简单的例子,一个安全的 API 既要支持安全控制上的可扩展,还要禁止被更改。

对于纯粹的关系型数据库,里氏替换原则通常不是问题,但当你使用表继承时,就会暴露出问题了。这里有一个例子,my_square 表继承了 my_rectangle 表。

复制代码
CREATE TABLE my_rectangle ( id serial primary key, height numeric, width numeric );
CREATE TABLE my_square ( check (height = width) ) INHERITS (my_rectangle);
and run an update on my_rectangle -
UPDATE my_rectangle SET height = height * 2

这将导致在 square 表中产生引用问题,最终导致运行失败。处理此问题有两个方法,避免整体更新(保持行不可变),或者在更新时,首先使用触发器将 my_square 表中的行删除,然后再插入到 my_rectangle 表中。

在数据库中应用接口隔离时,将涉及主要的用户自定义函数或存储过程。Chris 考虑把它们作为底层数据的接口,并建议理想情况下,在最小的逻辑范围内函数或存储过程应该只有一条大的查询——如果查询语句超过5 条或者具有大量的备选参数,就表明应该简化复杂度,把它们分解为多个独立的函数或存储过程,每一个针对一个特定的目标。这与单一职责原则也是相辅助相成的。

依赖反转和健壮的数据库接口方面,Chris 解释以什么方式封闭应用逻辑与存储过程的绑定会导致抽象泄露,并提出了几个建议的解决方案。其中某些使用类似于服务探测器模式的东西,或使用视图和函数,或使用自定义数据类型、触发器和通知。在此强烈建议,充分考虑各种选择,像应用一样设计数据库,使其暴露适当的API。

查看英文原文: SOLID Database Design With PostgreSQL


感谢贾国清对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2013-03-08 01:123263

评论

发布
暂无评论
发现更多内容

一文吃透Redis主从复制的原理

这我可不懂

redis

轻量应用服务器到底香在哪?

格致君的planB

数字化 亚马逊云科技 轻量应用服务器

Apache Hudi Timeline:支持 ACID 事务的基础

不在线第一只蜗牛

分享 教程 ACID

淘宝API商品数据接口——开启电商数据驱动之旅的钥匙

Noah

潮玩宇宙APP系统开发

薇電13242772558

NFT

3款免费又好用的 Docker 可视化管理工具

快乐非自愿限量之名

Docker 分享 教程 免费

软件测试|教你使用Python快速绘制酷炫词云图

霍格沃兹测试开发学社

软件测试|Python数据可视化神器——pyecharts教程(四)

霍格沃兹测试开发学社

借助 DSL 来简化 Loadgen 配置

极限实验室

集成测试 loadgen

选择困难症的我,最终选择了Amazon EC2 云服务器

不叫猫先生

云服务器 Amazon EC2 云服务器

在 LangChain 尝试了 N 种可能后,我发现了分块的奥义!

Zilliz

Milvus langchain rag chunking

软件测试|Python matplotlib教程(二)

霍格沃兹测试开发学社

高效节省IT资源,WorkPlus让企业轻松实现业务场景的快速移动化

WorkPlus

软件测试/校招推荐丨鼎捷软件股份有限公司岗位开放

测试人

软件测试

理论+实践详解最热的LLM应用框架LangChain

华为云开发者联盟

人工智能 华为云 华为云ModelArts 华为云开发者联盟 LLM

去中心化应用开发

西安链酷科技

区块链 加密货币 dapp 去中心化 交易所

如何规划并新建大数据平台的独立生产域?5步走

奇点云

奇点云 DataSimba 对象体系

一般的仿真软件需要什么配置的电脑?

思茂信息

仿真软件 仿真技术 仿真建模 仿真模拟

软件测试|一文教你学会Python文件 I/O 操作

霍格沃兹测试开发学社

Util应用框架快速入门(二)- Web Api 快速入门

何镇汐

开源 后端 软件开发

软件测试|matplotlib中文不显示的解决方案

霍格沃兹测试开发学社

全面解析独立服务器:如何选择最适合你的方案?

一只扑棱蛾子

独立服务器

亚马逊云服务器成了我的首选服务器

StackOverflow

云服务器 亚马逊云

软件测试|Python绘图神器matplotlib教程(三)

霍格沃兹测试开发学社

调用API接口获取淘宝关键词商品数据:详细指南与代码实践

Noah

苹果Mac强大的远程管理工具:Royal TSX for Mac激活版 支持M1

彩云

Royal TSX 远程连接管理

罗拉ROLA-IP代理IP:稳定性、纯净性、响应速度的保证

Geek_bf375d

软件测试|教你用Python操作Word文档(二)

霍格沃兹测试开发学社

软件测试|教你使用Python实现五子棋游戏(一)

霍格沃兹测试开发学社

Util应用框架快速入门(三)- UI 快速入门

何镇汐

开源 后端 开发软件

软件测试|教你用Python 操作Word文档(一)

霍格沃兹测试开发学社

用PostgreSQL设计可靠的数据库_语言 & 开发_Roopesh Shenoy_InfoQ精选文章