メインコンテンツまでスキップ

リレーションシップの編集

リレーションシップはキャンバスのコンテキストメニュー、キャンバスツールバー、クイック検索、またはショートカットで作成します。編集を始めるを参照してください。
このページでは、作成したリレーションシップに対してできることと、リレーションシップが追加する外部キーカラムの名前の付け方を説明します。

削除​

リレーションシップのコンテキストメニューから削除できます。

コンテキストメニューから products と reviews の間のリレーションシップを削除

リレーションシップはテーブルやメモのようには選択しないため、ショートカットはありません。
リレーションシップは接続している対象とともに削除されます。テーブルを削除するとそのテーブルにつながるリレーションシップがすべて削除され、カラムを削除するとそのカラムを使うリレーションシップがすべて削除されます。

種類の変更​

リレーションシップのコンテキストメニューの Relationship Type から変更できます。
次の 4 つの種類から選択でき、現在の種類にはチェックが付きます。

  • Zero One
  • Zero N
  • One Only
  • One N

コンテキストメニューからリレーションシップの種類を Zero N から One Only、One N へ順に変更

これはリレーションシップの作成時に選ぶ 4 つの種類と同じで、それぞれにショートカットがあります。編集を始めるを参照してください。

ON DELETE と ON UPDATE​

リレーションシップのコンテキストメニューで、Relationship Type と Delete の間にある On Delete と On Update から設定します。
どちらにも同じ 6 つの項目があり、現在の項目にはチェックが付きます。

  • Not set
  • NO ACTION
  • CASCADE
  • SET NULL
  • SET DEFAULT
  • RESTRICT

Not set は句を書き出さないため、データベース自体の既定の動作が適用されます。新しく作成したリレーションシップはどちらも Not set で始まり、後から Not set を選ぶとアクションが解除されます。
2 つは互いに独立しており、一方を変更してももう一方はそのままです。
設定した内容はコネクタに表示されます。コネクタの読み方を参照してください。
テーブルと一緒にコピーして貼り付けたリレーションシップや、テーブルと一緒に複製したリレーションシップは両方のアクションを保持し、Schema SQL、DBML、AML を読み込むと、ファイルで宣言されているアクションが取り込まれます。ファイルの読み込みと書き出しを参照してください。

コンテキストメニューから orders と order_items の間のリレーションシップに ON DELETE CASCADE と ON UPDATE RESTRICT を設定し、コネクタにマウスを重ねて確認する様子

どのアクションも、データベースにかかわらず選択できます。
選択しているデータベースの Schema SQL が書き出さないアクションには、not in MySQL のような淡い色の注記が横に付きます。Not set に注記が付くことはなく、データベースを切り替えると注記も更新されます。
注記の付いたアクションもリレーションシップには保存されます。コネクタに表示され、JSON、DBML、AML にも保持されますが、そのデータベースの Schema SQL ではその句が省かれるため、データベースの既定の動作が適用されます。

Schema SQL が書き出すアクションは次のとおりで、それ以外は省かれます。

データベースON DELETEON UPDATE
DatabricksNO ACTIONNO ACTION
MSSQLNO ACTION、CASCADE、SET NULL、SET DEFAULTNO ACTION、CASCADE、SET NULL、SET DEFAULT
MariaDBNO ACTION、CASCADE、SET NULL、RESTRICTNO ACTION、CASCADE、SET NULL、RESTRICT
MySQLNO ACTION、CASCADE、SET NULL、RESTRICTNO ACTION、CASCADE、SET NULL、RESTRICT
OracleCASCADE、SET NULLなし
PostgreSQL5 つすべて5 つすべて
Snowflake5 つすべて5 つすべて
SQLite5 つすべて5 つすべて

コード生成の ORM の対象がどのアクションを出力するかは、選択しているデータベースだけでなく対象によっても変わります。コード生成を参照してください。

N:M リレーションシップ​

エディタは物理モデルをベースにしているため、N:M リレーションシップは下図のようにマッピングテーブルで表現します。

products と tags からマッピングテーブル product_tags へそれぞれリレーションシップを作成

GraphQL、DBML、AML を読み込むと、マッピングテーブルは自動で作成されます。
多対多の宣言は <left>_<right> という名前のテーブルとして読み込まれ、Junction table inferred from <left> <-> <right> というコメントが付き、識別リレーションシップで両側に接続されます。
ファイルの読み込みと書き出しを参照してください。

識別リレーションシップ​

リレーションシップを作成すると、親テーブルの主キーが NOT NULL の外部キーカラムとして子テーブルにコピーされるため、作成した直後は非識別リレーションシップです。
コピーされたカラムはキーのデータ型、既定値、コメントを引き継ぎますが、Unique と Auto Increment は引き継がず、名前は外部キーカラムの名前で説明するとおりに付けられます。
識別リレーションシップにするには、子テーブルのその外部キーカラムを、ショートカット Alt + K またはテーブルのコンテキストメニューの Primary Key で主キーに設定します。

Alt + K で product_id を主キーに設定・解除し、コネクタが実線と破線に切り替わる様子

この状態はエディタが自動で同期します。
子側のカラムがすべて主キーである間は識別リレーションシップとなり、いずれかが主キーでなくなった時点で非識別リレーションシップに変わります。

外部キーカラムの名前​

リレーションシップを作成すると、追加される各外部キーカラムには、そのカラムのコピー元である親のキーに基づいて名前が付けられます。

  • id、ID、uuid のような 1 語のキー名には、前に親テーブルの名前とアンダースコアが付きます。products の id は products_id になります。
  • member_id、userId、UserID のような複数語のキー名は、そのまま使われます。
  • 大文字と小文字を区別せずにテーブル自体の名前と一致する 1 語のキー名も、そのまま使われます。currency の currency は currency のままです。テーブルの名前を含んでいるだけのキーには、やはり接頭辞が付きます。user の username は user_username になります。

名前が文字と数字だけでできていて、大文字と小文字の切り替わりがない場合、その名前は 1 語です。
それ以外の文字は名前を区切るため、_id、order no、order-no は複数語です。
camelCase と同じように読む、大文字と小文字の切り替わりも名前を区切ります。小文字の後に大文字が続く場合(userId)、大文字 2 つの後に小文字が続く場合(IDCard、IDs)、ハングル、仮名、漢字のような大文字と小文字の区別がない文字が、区別がある文字と隣り合う場合(회원ID)です。
数字は語を区切らないため、id2 と SHA256 は 1 語です。大文字か小文字のどちらか一方だけで書かれた複合語も 1 語です。members の memberid は members_memberid になります。

テーブル名は、前後の空白を除いて書かれているとおりに使われます。大文字と小文字、途中の空白、ドットはそのまま残り、単数形にはされず、コード生成の Table Name Case と Column Name Case も影響しません。キーが ID の Users からは Users_ID ができます。
複合キーの各カラムには、それぞれ個別に名前が付けられます。キーが(tenant_id、id)の orders では、tenant_id と orders_id が追加されます。

子テーブルにすでにある名前と大文字と小文字を区別せずに一致する名前には、_2、_3 のように番号が付き、空いている最初の番号が使われます。
キーが id の users から同じテーブルへの 2 つ目のリレーションシップでは users_id_2 が追加され、キーが member_id の members の自己参照では member_id_2 が追加されます。
1 つの複合キーのカラムどうしも同じように番号が付けられ、そのまま使われる名前が先にその名前を確保します。キーが(id、user_id)の user では、user_id に対して user_id、id に対して user_id_2 が追加されます。

親テーブルに名前がない場合、キー名はそのまま使われ、重複したときはほかの名前と同じように番号が付きます。
名前のないキーからは、名前のない外部キーカラムができます。
主キーのない親にエディタが追加する主キーもこれに当たります。ただし、子テーブルをクリックする前にその主キーに名前を付けた場合は除きます。

名前はリレーションシップを作成した時点で決まります。後から親テーブルやそのキーの名前を変更しても、外部キーカラムの名前は変わりません。
読み込み、貼り付け、複製によって、カラムがすでにそろった状態で入ってくるリレーションシップは、それらのカラムの名前をそのまま保持します。
コーディングエージェントが erd_add_relationship でリレーションシップを追加した場合も、同じ名前になります。ツールを参照してください。

コネクタの読み方​

  • 識別リレーションシップは実線、非識別リレーションシップは破線で描画します。
  • 子側の端には、リレーションシップの種類に応じたカーディナリティ記号が付きます。Zero One は丸と棒、Zero N は丸と鳥の足、One Only は 2 本の棒、One N は棒と鳥の足です。
  • 親側の端は、外部キーカラムのいずれかが NULL を許可する場合は Zero One と同じ丸と棒、すべて NOT NULL の場合は One Only と同じ 2 本の棒になります。
  • コネクタにマウスを重ねると、そのコネクタと、それがつなぐ両方のテーブルのカラムが強調表示されます。

3 本のコネクタに順にマウスを重ね、それぞれがつなぐカラムとともに強調表示される様子

ON DELETE または ON UPDATEを設定したリレーションシップには、子側の端の横に D:C U:R のようなラベルが付きます。D: の後に ON DELETE のアクション、続いて U: の後に ON UPDATE のアクションが、それぞれ設定されている場合にだけ表示されます。
アクションは erwin の記法にならって省略されます。CASCADE は C、RESTRICT は R、SET NULL は SN、SET DEFAULT は SD、NO ACTION は NA です。どちらも設定していないリレーションシップにはラベルがありません。
ラベルは子テーブルから離れた側に置かれます。コネクタがそのテーブルの左右の辺から出る場合は線の上、上下の辺から出る場合は線の右に置かれ、カーディナリティ記号とは重なりません。
ラベルはキャンバスの背景色の小さな箱の上にコネクタと同じ色で描画され、コネクタと一緒に強調表示されます。ラベルはすべてのコネクタより上に描画されるため、ラベルと交差する線はラベルの下を通ります。
ラベルは、選択しているデータベースが何を書き出すかにかかわらず、リレーションシップに保存されているアクションを表示します。そのため、MySQL でも ON DELETE SET DEFAULT は D:SD と表示されます。

いずれかのアクションを設定したコネクタにマウスを重ねると、ON DELETE CASCADE や ON UPDATE RESTRICT のように句を省略せずに 1 行ずつ示すツールチップも表示されます。
ツールチップはラベルが非表示の間も表示されます。

ERD キャンバスのコネクタを非表示にするには Relationship の表示オプションを、ラベルだけを非表示にするには既定でオンになっている Referential Actions の表示オプションを使います。テーブルの表示オプションを参照してください。
テーブルが名前だけの表示に折りたたまれる 70% 以下では、ラベルは描画されません。PNG で書き出すと、キャンバスと同じようにラベルも描画されます。
Visualization タブの Flow モードは、Relationship がオフでもコネクタを描画します。各コネクタは同じ端の記号を持つ 1 本のなめらかな灰色の実線の曲線として描かれるため、このページで説明する破線、ラベル、ツールチップ、経路は ERD キャンバスにのみ当てはまります。

コネクタの経路​

コネクタは直交する経路で描画します。
経路は両端の間にあるテーブルを横切らずに迂回し、角は 45 度に切り落とされます。
テーブルの同じ辺から出る経路は、互いに重ならないように別々の通り道へ分けられます。

設定する項目はありません。
キャンバス上の要素が移動したりサイズが変わったりするたびに経路を自動で再計算するため、手作業で調整する必要はありません。

members テーブルを下へドラッグして戻す間、categories を迂回するように再計算されるコネクタの経路