社員Repositoryにのみ焦点を当てて実装方法を見てきましたが、次は依存関係のある複数のRepositoryについて見ていきます。
まずは下記を見てください。
classDiagram
direction TB
class employee{
UUID employee_id PK
timestamp created_at
}
class department{
UUID department_id PK
timestamp created_at
}
class assignment{
UUID employee_id FK
UUID department_id FK
timestamp created_at
}
employee <|-- assignment
department<|-- assignment
社員、部署、配属をモデリングしたものです。
ここで「配属理由」というvalueテーブルを追加したいとします。
するとこのようになりました。
classDiagram
direction TB
class employee{
UUID employee_id PK
timestamp created_at
}
class department{
UUID department_id PK
timestamp created_at
}
class assignment{
UUID employee_id FK
UUID department_id FK
timestamp created_at
}
employee <|-- assignment
department<|-- assignment
class assignment_reason{
UUID employee_id FK
UUID department_id FK
text reason
timestamp created_at
}
employee<|-- assignment_reason
department<|-- assignment_reason
配属理由valueテーブルがemployee_idとcompany_idのふたつのidに依存するようになってしまいました。
「valueテーブルはひとつのidテーブルにしか依存しない」というルールを破ってしまいました。
では、配属理由テーブルが配属テーブルに依存するように修正してみましょう。
classDiagram
direction TB
class employee{
UUID employee_id PK
timestamp created_at
}
class department{
UUID department_id PK
timestamp created_at
}
class assignment{
UUID assignment_id PK
UUID employee_id FK
UUID department_id FK
timestamp created_at
}
employee <|-- assignment
department<|-- assignment
class assignment_reason{
UUID assignment_id FK
text reason
timestamp created_at
}
assignment<|-- assignment_reason
配属テーブルに配属idを追加し、配属理由テーブルが配属idに依存するようにしました。
これをすることで「idテーブルでは依存関係を表現する」「valueテーブルでは値を表現する」という整理をすることができました。
idテーブルとvalueテーブルのルールを守ると、このようにデータの責務が明確になり、凝縮度が高まります。
データモデリングはこれで一旦終わりにし、Repositoryを作っていきます。
ライフサイクルとは、それが生まれてから死ぬまでの期間のことです。
プログラミングの業界では特にインスタンスの生成から破棄までの期間のことを言います。
イミュータブルデータモデルではデータの破棄はしないため、データの生成に焦点を当てます。