🎃

複雑さの中からエンティティを抽出する考え方

2022/10/25に公開約2,500字

エンティティとは

エンティティという言葉はいろんなところで聞きます。リレーショナルデータベースの世界だけでなく、ドメイン駆動設計や金融、はてはマインクラフトまで、いろんなところに「エンティティ」がいます。

(実在する)物;(他から独立した)存在(物),統一体;(思考対象として)もの
(属性に対して)本質,実体

引用元:『プログレッシブ英和中辞典』

いずれに「他とは異なるただ一つのもの」特性を満たすという点では違いがなさそうです。
しかし「一つ」とはなんでしょうか。例えばZennのようなサービスを元に考えてみます。

エンティティを満たす要素

エンティティ=1つのなにかしらのものはわかりましたが、結局何がベストなのかはまだ不明瞭です。

単一性(なにがひとつなのか)

Zennでいうとこの「1つのノート」が当てはまりそうです。しかし少なくともノートに対してはいくつか種類がありそうです。(ノートという名称は存在しませんが、記事とわけるために使います)

  • スクラップ
  • 記事

これらは全て「1つの記事」でしょうか?本であれば章があるし、スクラップは連続していくつかの項目を作成できそうです。
この定義に関しては「場合による」というのが答えになります。記事にしたって、公開・非公開、編集など様々な履歴があり、場合によっては本を1記事として取り扱うのが便利なシチュエーションもありそうです。(本の売り上げ管理など)

同一性(なにをもって同じとするか)

記事は編集できます。タイトルが変わった時にそれは「同じ記事」として取り扱ってもいいでしょうか。
Googleドキュメントのように履歴管理ができてもよさそうです。その場合は履歴に対しても「他とは異なるただ一つのもの」が当てはまりそうです。

分類(なにとまとめるか)

Zennの場合、本だと有料と販売することも可能なようです。スクラップと本は同じように扱う方がよさそうでしょうか。

結局エンティティはなにをみたせばよいのか

いくつかの性質を挙げましたが、どれも完全な正解はありません。
どの観点においてもそのサービス・プロダクトが何を作るシステムなのかから「自分達で決める」必要がありそうです。

例を挙げてみます。

  • URLから同じ記事にたどり着けるようにしたい
    • この場合は「記事を1つ」として取り扱うと良さそう
  • 記事の編集履歴を管理したい
    • この場合は「記事の保存を1つ」として取り扱うと良さそう
  • 本の収益管理をしたい
    • この場合は「本を1つ」として取り扱うとよさそう
  • 本を章毎に分割したい
    • この場合は「章、もしくはそのなかの文章を1つ」として取り扱うと良さそう

これをみていると「何を1つとして扱いたいか」という目的によって「何をエンティティ」とするかが決まるということがわかると思います。

もうちょっと具体的に考えてみる

「RF-1」という車のタイヤを買うときを考えてみましょう。

  1. ショップがそのタイヤの在庫を考えるときは「RF-1」のタイヤならどれでもいい(サイズなどがあってればどれでもよい)
  2. 買った人からするとそのタイヤが「いついくらで買ったか」が大事
  3. 装着された車からすると同じタイヤだとしても右前輪なのか左後輪なのかが大事(減りが変わったりする)

シチュエーション1 / 在庫管理

この場合だと「Product(お店が扱う商品)」がタイヤになりそうです。
製品は在庫をもっており、それぞれメーカーに紐づくという形になっています。
ここではタイヤを示すエンティティが 「RF-1という種類の商品」 となり、個別のタイヤ自体に対してIDを振る(識別する)必要はなさそうですね。

シチュエーション2 / 家計簿

この場合だと「Item(家計簿に書いてある品目の一つ)」がタイヤになりそうです。
タイヤを示すエンティティが 「お金を払って買った何かしらのモノ」 となり、個別のタイヤ自体に対してIDを振る(識別する)必要はなさそうですね。というよりもはや「タイヤ」であることはデータの中にはまったく現れなさそうです。

シチュエーション3 / 車の管理システム

もはや言う必要もないですが「Tire」がタイヤですね。
今までの感じとは異なり「どのタイヤがいつどの場所(右前輪)に設置されたか」を管理したいパターンです。
その場合は、4つあるタイヤそれぞれを識別する必要があります。となるとエンティティは 「個別のタイヤそのもの」 を示す方が良さそう(そのタイヤに対してIDを振る)です。

まとめ

エンティティを抽出することは、システムの要求を満たす様々なリソースやイベントをどう識別するのか(なにを1つとしてなにを同じとするのか)を考えれば、よいものができるはず。
完全にベストな方法はなく、目的に応じたディスカッションを行う必要がある。

Discussion

ログインするとコメントできます