WBCが楽しかったので、野球のペナントレースを表すデータモデルを考えてみた。まずは基礎となる球団や選手、およびそれらの年次成績(年次サマリ)の関係を見てほしい(図1)。
年次サマリには「セパ別年次サマリ」、「球団別年次サマリ」、「選手別年次サマリ」の3種類あるが、これらのうち「選手別年次サマリ」の主キーが{選手№+年}ではなく{選手№+所属開始日+年}となっている点に注意してほしい。この主キーは「所属球団」の主キー{選手№+所属開始日}に<年>を複合させたものだ。これはシーズン中の移籍にともなって成績がリセットされるためである。つまり、選手の年間成績は「所属球団」を年で展開した定義域に関数従属する。
3つの年次サマリには集計項目(カッコ付きは論理フィールド*1であることを示す)がいくつか載っているが、その集計過程を説明しよう。「セパ別年次サマリ」上の<試合数>は「試合」の件数を合計して得られる。「球団別年次サマリ」上の<勝ち数>等は関連する「対戦チーム」上の試合結果から計算される。「選手別年次サマリ」上の<登板数>や<安打数>等は関連する「出場選手」の内容から計算される。いずれも各試合が終わった後で更新されると考えてもらえばいい。
つづいて、上述した集計の元ネタとなる試合の詳細情報を見よう(図2)。「進行履歴」に置かれた<進行区分>は、"投球"、"牽制"、"走塁"、"交代"のいずれかの値をとり、それぞれで異なる項目のまとまりに値がセットされる。試合開始時点の「出場選手」の<先発ポジション>から、先発メンバーの一覧(ポジション)が確立される。その後、投球のたび、牽制のたび、走塁のたび、選手交代のたびに「進行履歴」が追加され、「イニング」、「ポジション」、「出場選手」の内容が最新状態に更新される。「一球速報」というネット上のサービスがあるが、これは進行履歴レコードの追加とこれに伴う関連レコードの変化をいい感じでグラフィック表示したものに他ならない。
いかがだろう。複合主キーや動的参照関係*2を駆使しないと扱えない正統的なデータ指向(DOA)系のモデリング課題であることがよくわかると思う。テーブル数が少ないので一般の業務システムと比べたら簡単だが、主キー設計のアマいプロセス指向(POA)系の手法では歯が立たない。じっくり眺めて学習教材として活用してほしい。
*1.論理フィールドには、多重度1の上位テーブル上の属性を継承した「継承属性」と、関連するフィールドから算出される「導出属性」の2種類がある。集計項目は典型的な導出属性。
*2.「動的参照関係」とは、論理フィールドを含めた外部キーを基礎として成立する参照関係のこと。物理フィールドのみで構成される外部キーの場合は「静的参照関係」という。動的参照関係と静的参照関係の比率は筆者の経験では4:6くらいなので、モデリングに際しては前者の知識がどうしても必要になる。