2009年11月16日 | 「実践編-12 実装形の作りかた」 を読む | >> 目次にもどる |
2018年 9月 1日 補遺 |
(1) 対照表
以上の調整点については、「赤本」 の説明を読んでもらうとして、ほかの考慮点を以下に述べてみます。
実装形を いったん作成したあとでも、多量 データ を ストア している テーブル に対して高 パフォーマンス を もとめられている場合には、その テーブル を分割する場合があります──ただし、「INDEX-only」 を使っている、という前提です。モデル を作成したときに、構文論的・意味論的に完全である テーブル は、その状態が 「最小の意味単位」 なのですが、高 パフォーマンス を実現するために、意図的に いっそう分割する、ということです──したがって、「(完結した) 意味」 を崩した状態を作る、ということです。
たとえば、以下の テーブル を使って、意図的な テーブル 分割を説明してみます。
TABLE
「INDEX-only」 を前提にします。この テーブル に対して、index-key が すでに 5つ定義されている、とします。
( a, b, c, e, f ).
( b, e ).
( c, f ).
( a, c ).
( f ).
ちなみに、(使っている コンピュータ の CPU や メモリー 量にも依りますが、) ORACLE や DB2 では、高 パフォーマンス を実現するのであれば、UPDATE の対象になっている ひとつの テーブル に対して index-key は 5つ以内にしたほうが良いでしょう──なお、SQL/Server や PostgreSQL では、3つに止めたほうがいいでしょう。この テーブル に対して、以下の view を もとめられた、とします。
( c, a, f ).
勿論、「INDEX-only」 で対応します。しかし、この テーブル に対して、index-key は、すでに 5つ定義されているので、それ以上の index-key を定義すれば、パフォーマンス に影響するかもしれないので、テーブル を以下のように分割したほうがいいでしょう。
TABLE-1
TABLE-2
これらの テーブル では、以下のような index-key が定義されます。
TABLE-1 に対して、
( c, a, f ).
( c, f ).
( a, c ).
( f ).
TABLE-2 に対して、
( b, e ).
そして、TABLE-1 と TABLE-2 を a で join して、TABLE を 構成します。
上述した例は、説明を簡単にするために view を使って説明したのですが、UPDATE も 当然 考慮して テーブル を分割します── commit を考慮しなければならないので。実地の設計では、それぞれの データ 項目を見極めて テーブル を分割してください。本文で私が謂いたかった点は、高 パフォーマンス を実現するために、時として、「最小の意味単位」 を さらに分割することもある、ということです。現場では、それを標語にして以下のように云っています。
「(高 パフォーマンス を実現するには、テーブル を) ちぎって、ちぎって、ちぎる」
□ |
[ 補遺 ] (2018年 9月 1日)
私が講師をしている モデル 技術の セミナー に対して、「実装形」 について語ってほしいという要望が 多々 出されますが、私自身は 「実装形」 について それほど拘っている訳ではない──「実装形」 について、私が一つ拘っている点は、「(F-真が いったん験証されたならば、) 実装形は どのような L-真の形を採ってもいい」 ということです。つまり、事業分析において F-真を いったん験証したならば、データ 構造は複数存在する L-真のいずれを使ってもいいというのが私の基本的態度です。ただし、L-真を崩すことは認めない。 たとえば、次のような モデル があるとする──出荷してから請求する、という基本的な事業形態であるが、或る商品に対しては、請求してから出荷するという形態を導入しているとする。
出荷 { 出荷番号、商品番号 (R)、出荷日、出荷数、... }──────────────────┐ ┼ │ 請求 ┼ │ { 請求書番号、出荷番号 (R)、請求日、請求金額、... }─┐ │ ├×─ 請求 ├×─ 出荷 請求 ┘null (出荷番号、商品番号) │null (請求番号、商品番号) { 請求書番号、商品番号(R)、請求日、請求金額、... } │ ┼ │ 出荷 ┼ │ { 出荷番号、請求番号 (R)、出荷日、出荷数、... }──────────────────┘事業分析の モデル では、この記述が F-真かつ L-真ですが、データ 構造としては、クラス (スーパーセット の 「請求」 「出荷」) で実装するかもしれない──すなわち、null 在りの状態で実装するかもしれない [ ただし、null が生じることは アトリビュート・リスト の 「制約・束縛」 欄に記述されている ]。 どのような実装形になるかは、使っている ツール (OS、データベース、プログラム 言語あるいは フレームワーク など) の設計思想や機能に依存します。使っている ツール の設計思想や機能を加味して モデル を調整することを物理設計と云っています。 たとえば、データベース が 「べつべつの物理 ファイル を一つの論理 ファイル として扱うことができる」 ような プロダクト なら、前述した モデル を例にすれば、クラス (スーパーセット) で実装しないで下位の 出荷・請求をそれぞれ実装して、データベース 自体が クラス の状態を扱っているでしょう。そういう機能を搭載していない データベース を使うのであれば、クラス (スーパーセット) の状態で実装しかない。要するに、プロダクト の機能を加味して実装を決めるということです。 性能のいい データベース を使って プログラム の ソース・コード のすべてを プログラマ が作成するのであれば、F-真の モデル をそのまま実装形にするのが理想なのですが、たぶん、現代では、フレームワーク などの プログラム 生成 ツール を使っていることが多いでしょう。そうであるならば、フレームワーク の設計思想や機能を加味して、モデル を調整するのは当然でしょうね。 私が関与している client であれば、client が使っている ツール を私はわかっているので、実装形を どうすればいいかを指導できるのですが、私が関与していない場合には実装形を どのようにすればいいかを語ることはできない。だから、私は、セミナー では実装形を語ることをしない [ できない ] のです。 |
<< もどる | HOME | すすむ >> | |
目次にもどる |