制約の命名規則
最も一般的なオプションは、データベース制約とインデックスの名前をRailsに選ばせるか、PostgreSQLにデフォルトを使わせることです(該当する場合)。しかし、Railsでカスタム名を定義する場合や、ORMを使用しないGoアプリケーションで作業する場合は、一貫性と発見しやすさを向上させるために厳密な命名規則に従うことが重要です。
以下の表に、PostgreSQLのカスタム制約の命名規則を示します。この意図は、既存のデータベースの名前を遡及的に変更することではなく、将来の変更の一貫性を確保することです。
| 種類 | 構文 | 備考 | 使用例 | 
|---|---|---|---|
| 主キー | pk_<table name> | pk_projects | |
| 外部キー | fk_<table name>_<column name>[_and_<column name>]*_<foreign table name> | fk_projects_group_id_groups | |
| インデックス | index_<table name>_on_<column name>[_and_<column name>]*[_and_<column name in partial clause>]* | インデックス名はすべて小文字でなければなりません。 | index_repositories_on_group_id | 
| 一意制約 | unique_<table name>_<column name>[_and_<column name>]* | unique_projects_group_id_and_name | |
| チェック制約 | check_<table name>_<column name>[_and_<column name>]*[_<suffix>]? | オプションの接尾辞は、 lengthやenumのように、検証のタイプを示す必要があります。 また、同じ列に対する複数のCHECK制約を曖昧にしないために使用することもできます。 | check_projects_name_lengthcheck_projects_type_enumcheck_projects_admin1_id_and_admin2_id_differ | 
| 除外制約 | excl_<table name>_<column name>[_and_<column name>]*_[_<suffix>]? | オプションの接尾辞は、実行される除外のタイプを示します。 | excl_reservations_start_at_end_at_no_overlap | 
観測
- 
db/structure.sqlにコンフリクトがないかチェック。
- 接頭辞は、アルファベット順にグループ化するだけでなく、与えられた制約のタイプを素早く特定することを容易にするので、接尾辞よりも好まれます;
- 列名を結合する_and_は、PostgreSQLで定義されている63文字の長さの制限内に識別子を保つために省略することができます。さらに、この制限を守るのに苦労する場合は、表記をできる限り省略することができます。
- 非常に特殊な問題を解決するために追加されたインデックスについては、その用途を反映した名前にすることが理にかなっているかもしれません。
