命名规范
- 对象名(如库、表、索引等)字符总长度小于等于63。
- 禁止对象名(表名、列名、函数名、视图名、序列名等对象名称)使用数据库保留字,不要以pg、数字或下划线开头,具体可参考PostgreSQL官网数据库保留字相关内容。
- query语句中的别名不要使用 “小写字母,下划线,数字” 以外的字符,例如中文。
- 建议主键索引应以 pk_ 开头, 唯一索引要以 uk_ 开头,普通索引要以 idx_ 打头。
- 建议临时表以 tmp_ 开头,子表以规则结尾,例如按年分区的主表如果为tbl,则子表为tbl_2016,tbl_2017。
设计规范
- 多表中的相同列以及有JOIN需求的列,必须保证列名一致,数据类型一致。
- btree索引字段不建议超过2000字节,如果有超过2000字节的字段需要建索引,建议使用函数索引(例如哈希值索引),或者使用分词索引。
- 使用外键时,如果你使用的RDS-PostgreSQL版本没有自动建立fk的索引,则必须要对foreign key手工建立索引,否则可能影响references列的更新或删除性能。
- 出于全球化的考略,建议所有的字符存储与表示均以UTF-8编码。
- 表结构设计应该预先规划,避免经常修改表结构,建议单表字段数不超过64个。
- 建议有定期历史数据删除需求的业务表建议分区,例如以时间分区,清理数据时建议通过DROP或者TRUNCATE操作对应的表,不要使用DELETE。
SQL规范
- 查询时指定返回需要的字段,不要返回用不到的字段。
- 查询条件中,建议使用NOT EXISTS替代NOT IN。
- 查询或比较字段是否为NULL时,只能使用IS NULL或IS NOT NULL条件。
稳定性与性能规范
- 在代码中写分页查询逻辑时,若count为0应直接返回,避免执行后面的分页语句。
- 两阶段提交的事务,要及时提交或回滚,否则可能导致数据库膨胀。
- 建议使用truncate代替delete操作全表。
- 建议客户应用程序开启autocommit,同时避免应用程序自动begin事务,并且不进行任何操作的情况发生,某些框架可能会有这样的问题。
- 高并发业务场景下,务必使用绑定变量(prepared statement),防止数据库硬解析消耗过多的CPU资源。
管理规范
- 在执行DDL操作数据尤其是删除和修改数据记录场景下,要先select,避免出现误删除,确认无误才能提交执行。
- 用户可以使用explain analyze查看实际的执行计划,但是如果需要查看的执行计划设计数据的变更,必须在事务中执行explain analyze,然后回滚。
- 建议为数据库访问账号设置复杂密码。
- 建议用户做账户权限控制,避免大量使用高权限用户操作。