_。
#### 无特殊理由不应在其他模式中创建对象。
#### **【推荐】 关系命名规则**
#### 关系命名以表意清晰为第一要义,不要使用含混的缩写,也不应过分冗长,遵循通用命名规则。
#### 表名应当使用复数名词,与历史惯例保持一致,但应尽量避免带有不规则复数形式的单词。
#### 视图以v_作为命名前缀,物化视图使用mv_作为命名前缀,临时表以tmp_作为命名前缀。
#### 继承或分区表应当以父表表名作为前缀,并以子表特性(规则,分片范围等)作为后缀。
#### **【推荐】 索引命名规则**
#### 创建索引时如有条件应当指定索引名称,并与PostgreSQL默认命名规则保持一致,避免重复执行时建立重复索引。
#### 用于主键的索引以_pkey结尾,唯一索引以_key结尾,用于EXCLUDED约束的索引以_excl结尾,普通索引以_idx结尾。
#### **【推荐】 函数命名规则***
#### 以select,insert,delete,update,upsert打头,表示动作类型。
#### 重要参数可以通过_by_ids, _by_user_ids的后缀在函数名中体现。
#### 避免函数重载,同名函数尽量只保留一个。
#### 禁止通过BIGINT/INTEGER/SMALLINT等整型进行重载,调用时可能产生歧义。
#### **【推荐】 字段命名规则**
#### 不得使用系统列保留字段名:oid, xmin, xmax,cmin, cmax, ctid等。
#### 主键列通常命名为id,或以id作为后缀。
#### 创建时间通常命名为created_time,修改时间通常命名为updated_time
#### 布尔型字段建议使用is_,has_等作为前缀。
#### 其余各字段名需与已有表命名惯例保持一致。
#### **【推荐】 变量命名规则**
#### 存储过程与函数中的变量使用命名参数,而非位置参数。
#### 如果参数名与对象名出现冲突,在参数后添加_,例如user_id_。
#### **【推荐】 注释规范**
#### 尽量为对象提供注释(COMMENT),注释使用英文,言简意赅,一行为宜。
#### 对象的模式或内容语义发生变更时,务必一并更新注释,与实际情况保持同步。
### **0x02 设计规范**
#### Suum cuique
#### **【强制】 字符编码必须为UTF8**
#### 禁止使用其他任何字符编码。
#### **【强制】 容量规划**
#### 单表记录过亿,或超过10GB的量级,可以考虑开始进行分表。
#### 单表容量超过1T,单库容量超过2T。需要考虑分片。
#### **【强制】 不要滥用存储过程**
#### 存储过程适用于封装事务,减少并发冲突,减少网络往返,减少返回数据量,执行少量自定义逻辑。
#### 存储过程不适合进行复杂计算,不适合进行平凡/频繁的类型转换与包装。
#### **【强制】 存储计算分离**
#### 移除数据库中不必要的计算密集型逻辑,例如在数据库中使用SQL进行WGS84到其他坐标系的换算。
#### 例外:与数据获取、筛选密切关联的计算逻辑允许在数据库中进行,如PostGIS中的几何关系判断。
#### **【强制】 主键与身份列**
#### 每个表都必须有身份列,原则上必须有主键,最低要求为拥有非空唯一约束。
#### 身份列用于唯一标识表中的任一元组,逻辑复制与诸多三方工具有赖于此。
#### **【强制】 外键**
#### 不建议使用外键,建议在应用层解决。使用外键时,引用必须设置相应的动作:SET NULL, SET DEFAULT, CASCADE,慎用级联操作。
#### **【强制】 慎用宽表*