PostgreSQL是一个功能强大的开源对象-关系型数据库管理系统(ORDBMS),它以其可靠性、健壮性、灵活性和支持标准SQL的能力而著称。PostgreSQL项目是由一群志愿者开发的,始于1986年,当时是作为加州大学伯克利分校的POSTGRES项目的一部分。
特点
- 开源:PostgreSQL是开源软件,遵循宽松的BSD许可证,允许用户免费使用、修改和分发。
- 扩展性:用户可以定义自己的数据类型、函数和存储过程。
- 事务性:支持多版本并发控制(MVCC),确保了事务的ACID属性(原子性、一致性、隔离性和持久性)。
- 高级查询能力:支持复杂的查询,包括子查询、连接和窗口函数。
- 存储过程:支持多种编程语言编写存储过程,包括PL/pgSQL、C、Python等。
- 触发器和视图:支持触发器和复杂的视图,可以用于实现复杂的业务逻辑。
- 复制和故障转移:支持多种复制解决方案,包括流复制和逻辑复制。
- 索引:支持多种索引类型,如B-tree、哈希、GiST、GIN和BRIN。
- 全文搜索:内置全文搜索能力。
- 数据完整性:支持外键、检查约束、唯一约束和排除约束。
优点
- 可靠性:PostgreSQL有着良好的稳定性记录,适合关键业务应用。
- 功能丰富:提供了大量高级数据库功能,无需额外的费用。
- 社区支持:拥有一个活跃的社区,提供大量的文档、插件和帮助。
- 可扩展性:可以通过添加新的数据类型、函数和索引方法来扩展其功能。
- 兼容性:遵循SQL标准,提供了良好的兼容性。
应用场景
- Web应用程序:由于其强大的查询能力和稳定性,PostgreSQL是开发Web应用程序的理想选择。
- 移动应用:作为后端数据库,支持移动应用的离线操作和数据同步。
- 数据仓库:支持复杂的分析查询,适合数据仓库应用。
- 地理信息系统(GIS):PostgreSQL通过PostGIS扩展支持GIS功能。
- 时间序列数据:通过TimescaleDB等扩展,可以高效地处理时间序列数据。
- 实时应用:支持高并发读写操作,适用于实时数据处理。
由来
PostgreSQL的前身是POSTGRES项目,由Michael Stonebraker教授领导的团队在1986年启动。POSTGRES是INGRES数据库系统的一个后继项目,旨在解决INGRES中的一些限制,并引入面向对象的概念。1996年,POSTGRES的代码被重新命名为PostgreSQL,以反映其对SQL标准的支持,并开始作为一个开源项目进行开发。从那时起,PostgreSQL社区持续发展,添加了新的功能,提高了性能和稳定性。
PostgreSQL支持广泛的数据类型,这些数据类型可以分为几个主要类别:标量类型
- 布尔类型:
boolean
- 数值类型:
- 整数类型:
smallint
,integer
,bigint
- 浮点类型:
real
,double precision
- 精确数值类型:
decimal
,numeric
- 序列类型:
serial
,bigserial
(自动增长的整数)
- 整数类型:
- 货币类型:
money
- 字符类型:
- 定长字符串:
character(n)
- 变长字符串:
varchar(n)
或character varying(n)
- 大型对象文本:
text
- 定长字符串:
- 二进制类型:
- 定长二进制字符串:
bit(n)
- 变长二进制字符串:
bit varying(n)
- 二进制大型对象:
bytea
- 定长二进制字符串:
- 日期/时间类型:
- 日期:
date
- 时间:
time
(无时区),time with time zone
- 日期和时间:
timestamp
(无时区),timestamp with time zone
- 时间间隔:
interval
枚举类型
用户定义的枚举类型,允许列值是预定义集合中的一个值。几何类型
用于表示平面上的点、线、盒子等几何形状。
- 日期:
point
line
lseg
(线段)box
path
polygon
circle
网络地址类型
用于存储IPv4、IPv6地址和MAC地址。cidr
(无类别域间路由)inet
(互联网地址)macaddr
位串类型
用于存储位串。文本搜索类型
用于全文搜索。UUID类型
用于存储通用唯一标识符(UUID)。XML类型
用于存储XML数据。JSON/JSONB类型
用于存储JSON(JavaScript Object Notation)数据。json
jsonb
(二进制JSON,更高效)Arrays
PostgreSQL也支持数组类型,可以创建由基本类型组成的数组。复合类型
允许将多个字段组合成一个记录。范围类型
用于表示数值、日期/时间或枚举值的范围。对象标识符类型
oid
,用于内部系统标识符。伪类型
这些类型主要用于内部或特殊目的,如void
、cstring
、any
、anyarray
、anyelement
、anyenum
、anynonarray
、anyrange
等。
这些数据类型为PostgreSQL提供了极大的灵活性和功能,使其能够满足各种数据存储和查询需求。