当前位置: 首页 > news >正文

PostgreSQL数据类型怎么选?

在数据库设计时,表字段的类型选择至关重要。它不仅影响数据库的存储效率和性能优化,还影响数据的完整性和扩展性。

本文分析了不同应用场景下可以使用的 PostgreSQL 数据类型,以及它们的存储需求和优缺点。

布尔值

数据类型BOOLEAN(推荐)SMALLINTBIT(不推荐)CHAR(1)
优点存储需求最小(1 字节);语义清晰;支持输入:true, yes, on, 1, false, no, off, 0。支持算术运算;可以存储真或假之外的数值。可以存储任何字符,输入灵活。
缺点只能存储真或者假。语义不够清晰;需要通过约束实现布尔逻辑;需要更多存储(2 字节)。需要更多存储(6 字节);只能存储 1/0;语义不够清晰;不易查询。需要通过约束实现布尔逻辑,需要更多存储(2 字节)。
百万行存储空间1 MB2 MB6 MB2 MB

UUID

数据类型UUID(推荐)TEXTCHAR(36)
优点存储优化(16 字节);校验 UUID 格式;索引优化。实现简单,格式灵活。固定长度。
缺点更多存储(36 字节 + 1 字节);索引低效;需要通过约束验证格式。更多存储(36 字节 + 1 字节);索引低效;需要通过约束验证格式。
百万行存储空间16 MB37 MB37 MB

备注:如果需要使用 UUID 作为主键,推荐使用 UUIDv7 这种基于时间排序的算法。随机生成的 UUID 可能导致 B-树分裂问题。

MD5

数据类型UUID(推荐)BYTEATEXTCHAR(32)
优点存储优化(16 字节);索引优化。存储优化(16 字节 + 4 字节);索引优化。实现简单,格式灵活。固定长度。
缺点MD5 显示成 UUID 格式。二进制数据不方便处理。更多存储(32 字节 + 4 字节);索引低效。更多存储(32 字节 + 4 字节);索引低效。
百万行存储空间16 MB20 MB36 MB36 MB

MD5 转换成二进制类型的方法如下:

SELECT DECODE(MD5('abc'), 'hex');

日期时间

数据类型DATE(推荐)TIMETIMESTAMPTIMESTAMPTZ(推荐)
优点高效存储日期;语义清晰存储于日前无关的时间信息同时存储日期和时间存储包含时区的日期和时间,支持全球化;兼容夏令时
缺点不包含时间信息不包含日期信息没有时区信息
百万行存储空间4 MB8 MB8 MB8 MB

二进制数据

数据类型BYTEA(推荐)TEXT
优点高效的二进制存储和处理应用程序处理简单
缺点应用程序需要编码/解码存储效率低
百万行存储空间2 MB - 2.1 PB1 MB - 1.1 PB

备注:对于文档、图像、音频、视频等二进制数据,不建议使用数据库存储,可以使用文件系统存储这些内容,并且在数据库中记录文件的访问地址。

货币数字

数据类型MONEY(不推荐)NUMERIC(15,2)(推荐)BIGINT(推荐)FLOAT(不推荐)
优点内置货币符号;方便存储财务数据;高效的存储和处理高精度存储;可以灵活设置存储精度可以将小数存储为整数;计算性能好计算性能最好
缺点只能支持一种货币符号;只能支持小数点后两位占用更多存储;计算性能不如浮点数应用程序需要进行小数转换,例如乘以 100 将小数点后的分转换为整数非精确数字;计算时存在精度损失
百万行存储空间8 MB11 MB8 MB4 MB/8 MB

枚举值

数据类型ENUMTEXTSMALLINT(推荐)SMALLINT查找表(推荐)
优点提供数据库级别校验;存储高效;可读性高使用灵活,方便增加新的枚举值存储高效;方便增加新的枚举值存储高效;方便增加新的枚举值;通过查找表可以获取更多信息
缺点删除某个枚举时比较复杂;对于动态枚举值不够灵活没有数据校验,可能导致数据不一致;可能占用更多存储没有数据校验;含义不明确,应用程序需要解释数据含义需要关联查询获取枚举值含义,增加了复杂度
百万行存储空间4 MB>=2 MB2 MB2 MB

文本

数据类型TEXT(推荐)VARCHAR(N)CHAR(N) (不推荐)
优点几乎没有长度限制;灵活易用限制了最大长度固定长度,占用固定大小
缺点需要通过检查约束限制长度需要提前定义最大长度;超长时出现错误使用空格填充,可能浪费空间;不适用于变长字符串
百万行存储空间2 MB - 1.1 PB2 MB - 1.1 PB2 MB - 1.1 PB

PostgreSQL 数据库中这三种字符串类型没有明显的性能差异,只是 CHAR 类型可能浪费一些存储空间,而指定字段的最大长度则需要消耗一些 CPU 执行长度校验。

数字

数据类型NUMERICFLOAT
优点超大范围精确数字;适合金融财务数据占用更少存储;计算速度更快,适合科学计算
缺点占用更多存储;计算更慢不够精确,可能存在舍入误差
百万行存储空间5 MB - 1 TB4 MB/8 MB

整数

数据类型SMALLINTINTEGERBIGINT
优点占用空间最少占用空间较少,支持较大范围数字支持超大范围数字
缺点支持的数字范围小占用空间最大
百万行存储空间2 MB4 MB8 MB

SAMLLINT 支持的数字范围从 -32768 到 32767,INTEGER 支持的数字范围从 -2147483648 到 2147483647,BIGINT 支持的数字范围从 -9223372036854775808 到 9223372036854775807。

JSON

数据类型JSONJSONB(推荐)
优点存储原始文本,保留空白符、顺序、重复键二进制存储,优化了查询性能;支持 GIN 索引
缺点读取速度更慢;不支持高效索引写入时需要更多解析操作;可能需要更多元数据存储
百万行存储空间2 MB - 1.1 PB2 MB - 1.1 PB

数组

数据类型ARRAYJSONB ARRAY
优点单个字段存储多个值,优化特定应用灵活存储多个值;支持索引
缺点查询和索引复杂;可能占用更多存储需要额外处理 JSON;可能占用更多存储
百万行存储空间12 MB - 1.1 PB8 MB - 1.1 PB

http://www.mrgr.cn/news/61369.html

相关文章:

  • 第五章:计算机网络
  • Vue2+OpenLayers添加/删除点、点击事件功能实现(提供Gitee源码)
  • PHP 使用 Redis
  • 链路追踪SkyWalking
  • 【开发日记】Docker修改国内镜像源
  • 【vue】vue的基础语法--上
  • LiNo论文解析
  • 【每日刷题】Day145
  • 架构师备考-背诵精华(计算机语言)
  • Java Lock Condition 源码
  • 代码质量与项目进度的博弈
  • Homework 1 - Random Distribution Related
  • 手写ioc容器(简易版)
  • 【jvm】如何设置堆内存大小
  • 事务学习一
  • 年薪百万打工人自爆:我的大厂生存指南!
  • 使用DeepLabV3实现植叶病害检测
  • File类踩坑记录
  • 细胞核荧光探针(一):一种红色发光、NADPH响应的的喹啉基
  • 【点云异常点检测数据集】Real3D-AD数据集介绍
  • 基于SSM大学生互动交流网站设计与实现
  • 四元数各个旋转API的使用
  • 【JSON相关漏洞(Hijacking+Injection)挖掘技巧及实战案例全汇总】
  • mongo实操笔记
  • 美团外卖霸王餐系统如何对接?有哪些具体步骤?
  • Java Lock LockSupport 源码