65行SQL中的类型约束

65行SQL中的类型约束

💡 原文英文,约1100词,阅读约需4分钟。
📝

内容提要

本文介绍了如何在PostgreSQL中创建表示语义版本(SemVer)的自定义数据类型,并添加验证规则以确保数据有效性。通过定义域和约束,确保版本号的各个组件符合要求。此外,文章还讲解了如何将SemVer类型转换为字符串表示,以便于查询和显示。自定义数据类型有助于提高数据完整性和性能。

🔎

延伸解读

域约束:让非法状态不可表示

文章通过PostgreSQL的域(Domain)功能,在semver_components复合类型上叠加检查约束,确保主要、次要、修补版本号非空且非负,预发布和构建元数据元素符合正则规则。这种设计将数据验证逻辑下沉到数据库层,任何插入或更新操作都会自动触发校验,避免了应用层遗漏。对于需要严格数据完整性的场景,域约束提供了一种声明式、可复用的解决方案。

生成列:平衡可读性与查询性能

直接查询semver类型返回的是元组形式,不便于阅读。文章建议使用semver_to_text函数转换为字符串,并通过生成列(generated column)将文本表示持久化存储。这样既保留了结构化数据的查询灵活性,又避免了每次查询时动态转换的性能开销。生成列由数据库自动维护,无需应用层干预,适合频繁按版本字符串过滤或排序的场景。

自定义类型的适用边界与代价

文章指出,构建高性能且易用的自定义类型需要大量“仪式感”,包括定义类型、域、辅助函数等。它最适合数据完整性至关重要、规范明确且变化不频繁的类型,如SemVer。若类型规范频繁变动,维护约束和函数的成本可能超过收益。此外,文章提到可进一步重载等号运算符、添加max函数等,但这些属于可选优化,需根据实际查询模式权衡。

❓

Q&A

如何在PostgreSQL中创建自定义数据类型?

可以通过定义复合类型并添加验证规则来创建自定义数据类型,例如创建表示语义版本的semver_components类型。

什么是语义版本(SemVer)?

语义版本是一种表示软件版本的规范,通常由主要版本号、次要版本号、修补版本号、预发布和构建元数据五个组件组成。

如何确保自定义数据类型的有效性?

可以通过定义域和约束来添加验证规则,确保数据的各个组件符合要求,例如主要版本号不能为null,次要版本号必须大于等于0。

如何将SemVer类型转换为字符串表示?

可以创建一个函数semver_to_text,将SemVer类型转换为字符串表示,以便于查询和显示。

使用自定义数据类型有什么好处?

自定义数据类型可以显著提高数据完整性和性能,尤其是在数据完整性至关重要的情况下。

如何在表中使用自定义的SemVer类型?

可以在表中定义一个semver类型的列,例如创建一个package_version表,其中包含package_semver列。

🏷️

标签

➡️

继续阅读