イミュータブルデータモデルでは必ず多重度が1:多になります。
erDiagram
id_table ||--o{ value_table :has
id_tableとvalue_tableが1:多の関係になっています。
そのため、同じvalueを複数持っている場合表現できなくなってしまっています。
例として、社員と資格について考えてみましょう。
erDiagram
employee ||--o{ qualification :has
この場合、下記のようなデータがinsertされます。
employeeテーブル
社員id | created_at |
---|---|
001 | 2020/4/1 |
002 | 2021/4/1 |
qualificationテーブル
社員id | 保有資格 | created_at |
---|---|---|
001 | 基本情報技術者 | 2020/5/1 |
001 | 応用情報技術者 | 2020/8/1 |
002 | ITパスポート | 2021/5/1 |
002 | CCNA | 2021/6/1 |
002 | LPIC | 2021/7/1 |
このようにinsertされてしまうと今有効な資格がわからない、という問題が発生します。
特にCCNAのような資格は有効期間が決まっており失効します。
これを解決するために失効日時のようなvalueテーブルを追加しても良いですが、そこまで厳密に有効な資格を判定する必要が無いのであれば、配列としてデータを持ったほうがシンプルに扱えるようになります。
qualificationsテーブル
社員id | 保有資格 | created_at |
---|---|---|
001 | 基本情報技術者 | 2020/5/1 |
001 | 基本情報技術者,応用情報技術者 | 2020/8/1 |
002 | ITパスポート | 2021/5/1 |
002 | ITパスポート,CCNA | 2021/6/1 |
002 | ITパスポート,CCNA,LPIC | 2021/7/1 |
002 | ITパスポート,LPIC | 2023/7/1 |
同じデータを何回もinsertしているように見えますが、それぞれ全く異なる意味を持っています。
配列として扱うことによって、資格の削除が簡単になっています。
<aside> 💡 ひとつのカラムに複数のデータが入るのは良くないと思うかもしれません。 ほとんどの場合その直感は正しいですが、今回の例は「社員が保有している資格」というひとつの意味で構成されています。 つまり、データをひとつだけにすることよりも、意味がひとつだけであることのほうが重要だということです。
</aside>