イミュータブルデータモデルでは必ず多重度が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>