データモデリングにおける1対1の関係とは何ですか?この関係をデータベースにどのように実装しますか?この記事の例は、これらの質問に答えます。
データモデリングのエンティティ(テーブル)間の関係には、次の3つのタイプがあります。
- 1対多の関係(1:Mとも呼ばれます)。
- 多対多の関係(M:N)。
- 1対1の関係(1:1)。
最も一般的なタイプの関係は1対多の関係であり、あるエンティティのレコードを別のエンティティの複数のレコードから参照できます。もう1つの一般的なタイプは、多対多の関係です。このタイプの関係は、論理データモデルでのみ使用されます。物理データベースでは、1対多の関係とジャンクションテーブルを使用して実装する必要があります。
この記事では、3番目のタイプの関係である1対1の関係について説明します。 。これは、データモデルで最も一般的でないタイプの関係です。 1対1の関係の例を示し、ERダイアグラムで1対1の関係の表記を示し、実際の1対1の関係について説明します。
1対1の関係の例
まず、1対1の関係とは何ですか?これは、あるエンティティ(テーブル)のレコードが別のエンティティ(テーブル)の1つのレコードに正確に関連付けられている関係です。
1対1の関係の実際の例をいくつか見てみましょう:
- 国-首都 :各国にはちょうど1つの首都があります。各首都はちょうど1つの国の首都です。
- 人-彼らの指紋 。それぞれの人は固有の指紋のセットを持っています。指紋の各セットは、正確に1人の人物を識別します。
- メール-ユーザーアカウント 。多くのWebサイトでは、1つの電子メールアドレスが正確に1つのユーザーアカウントに関連付けられており、各ユーザーアカウントはその電子メールアドレスによって識別されます。
- 配偶者-配偶者 :一夫一婦制の結婚では、各人に1人の配偶者がいます。
- ユーザープロファイル-ユーザー設定 。 1人のユーザーが1セットのユーザー設定を持っています。 1セットのユーザー設定は正確に1人のユーザーに関連付けられています。
わかりやすくするために、これらの例を1対1ではない関係と比較してみましょう。
- 国-都市: 各都市は正確に1つの国にありますが、ほとんどの国には多くの都市があります。
- 親-子 :各子には2人の親がいますが、各親には多くの子がいる可能性があります。
- 従業員-マネージャー :各従業員には、直属の上司またはマネージャーが1人だけいますが、通常、各マネージャーは多くの従業員を監督します。
ER図で1対1の関係を示す
ER図の1対1の関係は、すべての関係と同様に、2つのエンティティを結ぶ線で示されます。 「1つの」カーディナリティは、単一の直線で示されます。 (「多くの」カーディナリティは、カラスの足のシンボルで示されます。)
国と資本の1対1の関係は、次のように表すことができます。
垂直の直線は「必須」を意味します 」。この図は、資本が国を持つことが必須であり、国が資本を持つことが必須であることを示しています。
もう1つの可能性は、関係の一方または両方の側がオプションであるということです。 。オプションの辺は白丸で示されます。この図は、人とその指紋の間に1対1の関係があることを示しています。人は必須です(指紋は人に割り当てる必要があります)が、指紋はオプションです(人はデータベースに指紋が割り当てられていない場合があります)。
物理データベースでの1対1の関係
物理データベースに1対1の関係を実装する方法はいくつかあります。
外部キーとしての主キー
データベースに1対1の関係を実装する1つの方法は、両方のテーブルで同じ主キーを使用することです。主キーの値が同じ行は関連しています。この例では、フランスはcountry
です。 id
を使用 1とその首都はテーブルcapital
にあります id
の下 1.
country
id | |
---|---|
1 | フランス |
2 | ドイツ |
3 | スペイン |
capital
技術的には、次のデータモデルのように、主キーの1つを外部キーとしてマークする必要があります。
テーブルcapital
の主キー テーブルcountryのid列を参照する外部キーでもあります 。 capital.id
以降 は主キーであり、列の各値は一意であるため、資本は最大で1つの国を参照できます。また、必須 国を参照する–これは主キーであるため、空のままにすることはできません。
一意性制約のある追加の外部キー
データベースに1対1の関係を実装する別の方法は、新しい列を追加して外部キーにすることです。
この例では、列country_id
を追加します テーブル内capital
。 id
の大文字 1、マドリッドは国3、スペインに関連付けられています。
country
id | |
---|---|
1 | フランス |
2 | ドイツ |
3 | スペイン |
capital
id | country_id | |
---|---|---|
1 | マドリード | 3 |
2 | ベルリン | 2 |
3 | パリ | 1 |
技術的には、列country_id
id
を参照する外部キーである必要があります テーブルの列country
。各首都を正確に1つの国に関連付ける必要があるため、外部キー列をcountry_id
にする必要があります。 個性的。
実際の1対1の関係
最後の1対1の関係はほとんどありません
1対1の関係は、最も頻度の低い関係タイプです。この理由の1つは、実生活では1対1の関係がほとんど存在しないことです。また、ほとんどの1対1の関係は、一定期間のみ1対1です。モデルに時間コンポーネントが含まれ、変更履歴をキャプチャする場合は、よくあることですが、1対1の関係はほとんどありません。
一夫一婦制の関係が分裂したり、パートナーの1人が死亡したりする可能性があります。一夫一婦制の関係(結婚やシビルユニオンなど)の現実を長期にわたってモデル化する場合、それらが特定の期間だけ続くという事実をモデル化する必要があります。
人とその指紋は決して変わらないと思うでしょう。しかし、人が指を失ったり、指がひどく焼けたりした場合はどうなりますか?彼らの指紋は変わるかもしれません。それほど頻繁なシナリオではありません。それでも、一部のモデルでは、これを考慮する必要がある場合があります。
国とその首都が時間とともに変化するのと同じくらい安定しているように見える何かでさえ。たとえば、ボンは第二次世界大戦後、ベルリンが東ドイツの一部であったときに西ドイツ(Bundesrepublik Deutschland)の首都でした。これはドイツ再統一後に変わりました。ドイツの首都(Bundesrepublik Deutschland)は現在ベルリンです。これを考慮に入れるべきかどうかは、ビジネスの現実と作業しているアプリケーションによって異なります。
実行可能な1:1シナリオ:テーブルのオプション部分
私は実際の1対1の関係のための1つの実行可能なシナリオを考えることができます:テーブルのオプションの部分。テーブルがユーザーであると想像してください。 ユーザーデータを使用します。この表には、ユーザーの名前、メールアドレス、登録日などの一般的なユーザー情報が含まれています。また、そのアプリのカラーテーマや自動ログインなどのユーザー設定も含まれています。ただし、ほとんどのユーザーにはユーザー設定がありません。デフォルト設定を使用します。
user
id | signup_ date | ||||
---|---|---|---|---|---|
1 | ナタナエルタルボット | [email protected] | 2020-12-12 | 暗い | true |
2 | タリサイェーツ | [email protected] | 2020-12-14 | ||
3 | マーカスウィアー | [email protected] | 2020-12-15 | 軽い | false |
4 | ナタリーヘイズ | [email protected] | 2020-12-18 | ||
5 | モーリス教会 | [email protected] | 2020-12-20 | ||
6 | Arwa Valdez | [email protected] | 2020-12-21 |
このテーブルには空のフィールドがたくさんあります。 user
テーブルを2つのテーブルに分割:user
およびuser_settings
、選択したユーザーのユーザー設定に関する情報が含まれています。
user
id | signup_ date | ||||
---|---|---|---|---|---|
1 | ナタナエルタルボット | [email protected] | 2020-12-12 | 暗い | true |
2 | タリサイェーツ | [email protected] | 2020-12-14 | ||
3 | マーカスウィアー | [email protected] | 2020-12-15 | 軽い | false |
4 | ナタリーヘイズ | [email protected] | 2020-12-18 | ||
5 | モーリス教会 | [email protected] | 2020-12-20 | ||
6 | Arwa Valdez | [email protected] | 2020-12-21 |
user_settings
user_id | ||
---|---|---|
1 | 暗い | true |
3 | 軽い | false |
データを2つのテーブルに分割すると、テーブルのクエリがより複雑になります。両方のテーブルのデータを結合する必要があります。一方、メインのユーザー テーブルの管理は簡単です。
データベースの関係についてもっと知る
1対1の関係は、あるテーブルのレコードが別のテーブルの1つのレコードに正確に関連付けられている関係です。この種の関係は、実生活ではまれです。データモデルに時間を含めると、多くの1対1の関係が1対多または多対多の関係になります。データベースで1対1の関係を使用するための最も一般的なシナリオは、1つのテーブルを2つに分割することです。1つは必須列、もう1つはオプション列です。
この記事が気に入った場合は、ブログで1対多および多対多の関係に関する他の記事を確認してください。
データベースクラスを受講している学生の場合は、オンラインER図描画ツールであるVertabeloで無料のアカデミックアカウントを作成してください。 Vertabeloを使用すると、ブラウザで論理的および物理的なER図を直接描画できます。 PostgreSQL、SQL Server、Oracle、MySQL、Google BigQuery、Amazon Redshift、およびその他のリレーショナルデータベースをサポートします。試してみて、始めるのがいかに簡単かを確認してください!