关于 Postgres 我希望有人告诉我的事情

主要观点:作者在从事 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 中是“未知”,与其他编程语言中的nullnil值不同,有特定的比较运算符,如IS NULLIS NOT NULL等,COALESCE函数可用于处理NULL
  • 使psql更有用

    • 启用分页器(如less)可使长列或长值的表输出更易读,可通过设置环境变量export PAGER='less -S'实现,还可通过\pset expanded\xpsql会话中切换为“展开”模式。
    • 可设置\pset null '[NULL]'(或其他 Unicode 字符串)以明确输出中的NULL值,也可将其添加到~/.psqlrc文件中使其成为默认设置。
    • psql支持自动补全,可通过输入关键字或表名并按Tab键完成。
    • 有许多psql的快捷命令,如\?列出所有快捷命令、\d显示关系列表及所有者、\d+显示更多元数据、\d table_name显示表的模式等。
    • 可使用\copy命令将psql查询的输出复制到本地 CSV 文件,可添加HEADER选项包含列名。
    • SELECT语句中可使用AS关键字为输出列重命名,GROUP BYORDER BY也有列的简写方式,但不要在生产环境的查询中使用。
  • 索引相关

    • 索引是帮助查找数据的数据结构,最常见的是 B-tree 索引,可用于精确相等和范围条件查询,但不能指定使用特定索引,EXPLAIN可查看查询计划以了解 Postgres 如何执行查询。
    • 对于行数少的表,索引可能没什么用,创建多列索引时顺序很重要,对于前缀匹配需使用text_pattern_ops操作类。
  • 锁相关:锁用于确保同一时间只有一个客户端能进行危险操作,Postgres 中有多种表级锁定级别,不同级别之间存在冲突,长时间运行的ALTER TABLE或事务可能会导致其他客户端等待,影响数据库性能。
  • JSONB 特性:Postgres 可将可查询且高效序列化的 JSON 作为行中的值存储,但使用不当有缺点,如比正常列慢、不如标准表模式易文档化、与 Postgres 类型的操作较复杂等。

总之,作者希望这些内容能为使用 Postgres 数据库的人提供帮助,感谢他人的鼓励和反馈,并提供了自己的联系方式。

阅读 12
0 条评论