制約の命名規則

最も一般的なオプションは、データベース制約とインデックスの名前を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>]?オプションの接尾辞は、lengthenumのように、検証のタイプを示す必要があります。 また、同じ列に対する複数のCHECK 制約を曖昧にしないために使用することもできます。 check_projects_name_length
check_projects_type_enum
check_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文字の長さの制限内に識別子を保つために省略することができます。さらに、この制限を守るのに苦労する場合は、表記をできる限り省略することができます。
  • 非常に特殊な問題を解決するために追加されたインデックスについては、その用途を反映した名前にすることが理にかなっているかもしれません。