DB設計にアグリゲートの考えを導入する
RDBMSはテーブルがフラットに配置されています。テーブル間にリレーションを設定できますが、親子のような関係を定義することはできません。アグリゲートは、複数のオブジェクトを集約して意味的に1つの概念として扱うことで、複雑さを低減するテクニックです。
前回、DBに対してORMライブラリを利用するとテーブルから生成されたクラスを利用することであたかもテーブルに可視性を指定できるアイデアをあげました。今回はこの延長線上の話でDB設計にOOADのテクニックであるアグリゲートを適用するものです。
では、どのようにテーブルを集約するかですが、DB設計でテーブル設計する場合プライマリキーを考えます。このプライマリキーは多くの場合データの識別子になっておりビジネス上でのデータの識別に利用されているものです。このプライマリキーが同じテーブルを1つの概念で括ってアグリゲートと見立てます。
このアグリゲート単位の粒度はいろいろ役立ちます。たとえばDB処理でよく問題となる排他制御、デッドロックをさけるためにテーブルのアクセス順序をそろえるなど対策を行うのですが、実際の処理順序とテーブルのアクセス順序を両立させるのはかなり難しいです。これをテーブルのかわりにアグリゲート単位にできればロックの粒度が大きくなるのでやり易くなります。具体的にはあるアグリゲートのテーブルを更新する場合、ルートテーブルのレコードを必ず最初に更新予約ロックして排他するようにします。