Help us learn about your current experience with the documentation. Take the survey.
约束命名规范
最常见的选择是让 Rails 为数据库约束和索引选择名称,或者让 PostgreSQL 使用默认名称(如果适用)。然而,在 Rails 中定义自定义名称,或在没有使用 ORM 的 Go 应用程序中工作时,遵循严格的命名约定对于提高一致性和可发现性非常重要。
下表描述了自定义 PostgreSQL 约束的命名约定。 目的不是要追溯更改现有数据库中的名称,而是确保未来变更的一致性。
| 类型 | 语法 | 说明 | 示例 |
|---|---|---|---|
| 主键 | pk_<表名> |
pk_projects |
|
| 外键 | fk_<表名>_<列名>[_and_<列名>]*_<外键表名> |
fk_projects_group_id_groups |
|
| 索引 | index_<表名>_on_<列名>[_and_<列名>]*[_and_<部分子句中的列名>]* |
索引名称必须全部为小写。 | index_repositories_on_group_id |
| 唯一约束 | unique_<表名>_<列名>[_and_<列名>]* |
unique_projects_group_id_and_name |
|
| 检查约束 | check_<表名>_<列名>[_and_<列名>]*[_<后缀>]? |
可选后缀应表示验证类型,如 length 和 enum。也可用于区分同一列上的多个 CHECK 约束。 |
check_projects_name_lengthcheck_projects_type_enumcheck_projects_admin1_id_and_admin2_id_differ |
| 排他约束 | excl_<表名>_<列名>[_and_<列名>]*_[_<后缀>]? |
可选后缀应表示执行的排他类型。 | excl_reservations_start_at_end_at_no_overlap |
注意事项
- 检查
db/structure.sql中是否存在冲突。 - 优先使用前缀而非后缀,因为这样能更快地识别给定约束的类型,并按字母顺序对它们进行分组;
- 连接列名的
_and_可以省略,以使标识符保持在 PostgreSQL 定义的 63 个字符长度限制内。此外,如果难以保持在此限制内,可以尽可能缩写该表示法。 - 对于为解决特定问题而添加的索引,其名称反映其用途可能是合理的。