主要观点:作者在从事 Web 应用工作近十年中,发现 Postgres 的官方文档虽好但过于庞大,于是总结了与 Postgres 数据库合作前应了解的一些要点。
关键信息和重要细节:
- 数据规范化:应规范化数据,除非有充分理由不这样做。数据库规范化是去除数据库模式中重复或冗余数据的过程,虽有时去规范化(冗余数据)有意义,但通常有成本,如数据不一致或写入复杂性增加。
- 遵循 Postgres 建议:官方 Postgres 维基上有“不要这样做”的列表,如对所有文本存储使用
text类型、对所有时间戳存储使用timestampz/time with time zone类型、用snake_case命名表等。 SQL 特性:
- SQL 关键字大小写不重要,如
SELECT * FROM my_table WHERE x = 1 AND y > 2 LIMIT 10;与select * from my_table where x = 1 and y > 2 limit 10;等效果相同。 NULL在 SQL 中是“未知”,与其他编程语言中的null或nil值不同,有特定的比较运算符,如IS NULL、IS NOT NULL等,COALESCE函数可用于处理NULL。
- SQL 关键字大小写不重要,如
使
psql更有用:- 启用分页器(如
less)可使长列或长值的表输出更易读,可通过设置环境变量export PAGER='less -S'实现,还可通过\pset expanded或\x在psql会话中切换为“展开”模式。 - 可设置
\pset null '[NULL]'(或其他 Unicode 字符串)以明确输出中的NULL值,也可将其添加到~/.psqlrc文件中使其成为默认设置。 psql支持自动补全,可通过输入关键字或表名并按Tab键完成。- 有许多
psql的快捷命令,如\?列出所有快捷命令、\d显示关系列表及所有者、\d+显示更多元数据、\d table_name显示表的模式等。 - 可使用
\copy命令将psql查询的输出复制到本地 CSV 文件,可添加HEADER选项包含列名。 - 在
SELECT语句中可使用AS关键字为输出列重命名,GROUP BY和ORDER BY也有列的简写方式,但不要在生产环境的查询中使用。
- 启用分页器(如
索引相关:
- 索引是帮助查找数据的数据结构,最常见的是 B-tree 索引,可用于精确相等和范围条件查询,但不能指定使用特定索引,
EXPLAIN可查看查询计划以了解 Postgres 如何执行查询。 - 对于行数少的表,索引可能没什么用,创建多列索引时顺序很重要,对于前缀匹配需使用
text_pattern_ops操作类。
- 索引是帮助查找数据的数据结构,最常见的是 B-tree 索引,可用于精确相等和范围条件查询,但不能指定使用特定索引,
- 锁相关:锁用于确保同一时间只有一个客户端能进行危险操作,Postgres 中有多种表级锁定级别,不同级别之间存在冲突,长时间运行的
ALTER TABLE或事务可能会导致其他客户端等待,影响数据库性能。 - JSONB 特性:Postgres 可将可查询且高效序列化的 JSON 作为行中的值存储,但使用不当有缺点,如比正常列慢、不如标准表模式易文档化、与 Postgres 类型的操作较复杂等。
总之,作者希望这些内容能为使用 Postgres 数据库的人提供帮助,感谢他人的鼓励和反馈,并提供了自己的联系方式。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。