データベース特性

 たとえばゴブリン大部隊にいる指定されたキャラの空間座標を x, y, z に書き換える場合、間違いなく、

pDivison->get( id )->setPosition( x, y, z );

 という関係になってくる。

 まかり間違っても、

pDivision->setPosition( id, x, y, z );

 というような操作はつけないでしょう。

 他方、データベースなら、

UPDATE division set px=x, py=y, pz=z WHERE ID = id;

 と書ける。それをモデル化すれば、

pDivision->setPosition(id, x, y, z);

 というメンバ関数を持つのは当然の成り行きであり、このメンバ関数をコールする側としても、自然なオペレーションということに……

 別の視点もある。よく考えてみるとアプリケーションとデータベースはクライアントとサーバーの関係にあり、 get() しても得られるのはデータのコピーでしかない。

 これを、データ本体は別のプロセス、別のコア、別の記憶空間にあって直にアクセスすることは許されず、書き込みには同期が必要な状況として考えてみる。
(周辺プロセッサとのやりとりで起こり得るケースだと思う)

 CGoblin *pGoblin = pDivision->get( id );
 pGoblin->setLeader();
 pDivision->sync( pGoblin ); // 同期発生
 
 // リーダーを中心とした新しいスクワッドを作成
 CSquad *pNewSquad = pDivision->createSquad( pGoblin, 8 ); // 同期発生
 
 // リーダー周辺の負傷ゴブリンを取得して配属
 int itr;
 for (CGoblin *pFollower = pDivision->getWoundedFirst( &itr, pGoblin );
      !pFollower; pFollower = pDivision->getWoundedNext( &itr, pGoblin ))
 {
     if (!pNewSquad->add( pFollower ))
         break;
 
     pDivision->sync( pNewSquad ); // 同期発生
 }

 明らかに重そうだ。そして実際にパフォーマンスチェックで足を引っ張ってしまい、「お前のパートのせいで60fpsになんねえよ(−_−#)」などと責められたとしよう。

 しかし、もし、このプロセッサ(?)に、複数のデータ更新を1回の要請で変更することができ、そうするときレイテンシは最短になるという特別な転送モードが備わっていたらどうだろうか。

pDivison->setSomethongAll(...); // sync 発生

 とすることに何の抵抗もない。データベースのデータモデルとやりとりをするというのは、こういう感覚なのかもしれない。