おはようございます。プレイライフの熊崎です。
今回はマッピングテーブルにユニーク制約をつける理由について、記事を書いていきたいと思います。(よく考えてみたら当たり前のことなんですが、パッとイメージがつかなかったため、まとめることにしました。)
中間テーブルとは?
連想エンティティ (英: associative entity) は関係モデル理論や実体関連モデル理論で使用される用語である。リレーショナルデータベースでは、多対多の関係を解決するために、基本関係(または基本テーブル)を実装する必要がある。この種のエンティティを表す基本関係は、非公式に連想テーブルと呼ばれる。 上記のように、連想エンティティは、連想テーブルを使用してデータベース構造に実装される。連想テーブルは、同じデータベース内の同じまたは異なるデータベーステーブルからの列への参照を含むことができるテーブルである。
ref: https://ja.wikipedia.org/wiki/%E9%80%A3%E6%83%B3%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3
→ 多対多の関係を解決するためのテーブル
例: 記事テーブル(articles)とタグテーブル(tags)
→ 1つの記事には複数のタグが紐づく。1つのタグには複数の記事が紐づく。(多対多の関係)
articlesテーブル
id | title |
---|---|
1 | Railsで内部結合を行う方法 |
2 | 中間テーブルとは? |
3 | railsとNext.jsで、アプリケーションを作ってみた。 |
tagsテーブル
id | name |
---|---|
1 | Rails |
2 | Next.js |
3 | SQL |
中間テーブルを使用しない場合
articlesテーブル
id | title | first_tag | second_tag |
---|---|---|---|
1 | Railsで内部結合を行う方法 | 1 | 3 |
2 | 中間テーブルとは? | 3 | |
3 | railsとNext.jsで、アプリケーションを作ってみた。 | 1 | 2 |
tagsテーブル
id | name |
---|---|
1 | Rails |
2 | Next.js |
3 | SQL |
問題点
- 1つの記事に紐付けるタグの数を増やしたいときにカラムを増やさなければいけない。 = 変更に強くない。
中間テーブルを使用した場合
articlesテーブル
id | title |
---|---|
1 | Railsで内部結合を行う方法 |
2 | 中間テーブルとは? |
3 | railsとNext.jsで、アプリケーションを作ってみた。 |
tagsテーブル
id | name |
---|---|
1 | Rails |
2 | Next.js |
3 | SQL |
articles_tagsテーブル(中間テーブル)
id | article_id | tag_id |
---|---|---|
1 | 1 | 1 |
2 | 1 | 3 |
3 | 2 | 3 |
4 | 3 | 1 |
5 | 3 | 2 |
以上のように中間テーブルを用意することによって、記事に付けたいタグの上限数が変わるたびに、わざわざ1つの記事にタグのカラムを追加しなくても良くなる。これが中間テーブルを用意するメリット。
複合ユニーク制約とは?
UNIQUE 制約を単独のカラムだけではなく複数のカラムの組み合わせに UNIQUE 制約を設定することも可能です。次の書式を使用します。
例えば2つのカラムを対象に UNIQUE 制約を設定すると、それぞれのカラムの値は重複しても構いませんが2つのカラムの値の組み合わせと同じ組み合わせの値を格納しようとするとエラーとなります。
ref: https://www.dbonline.jp/sqlite/table/index11.html#section2
中間テーブルに複合ユニーク制約をつける理由
例:articles_tagsテーブル(中間テーブル)
article_idとtag_idの組み合わせに対してユニーク制約をつけない場合
id | article_id | tag_id |
---|---|---|
1 | 1 | 1 |
2 | 1 | 3 |
3 | 2 | 3 |
4 | 3 | 1 |
5 | 3 | 2 |
6 | 1 | 1 |
id:1とid:6の組み合わせが重複してる。
この場合だと、viewでタグを表示したいとき、同じ名前のタグが2つできてしまう。。。
なので、ユニーク制約を適用して、データの整合性を保つ必要がある。
まとめ
- 中間テーブルは多対多のモデルを関連づける時に使用される。
- 複合ユニーク制約は複数のカラムの組み合わせにユニーク制約を設定すること。
- データの整合性を保つために、中間テーブルには複合ユニーク制約をつける必要がある。
参考記事