2009年 1月16日 「技術編-20 セット と サブセット」 を読む >> 目次にもどる
2017年11月 1日 補遺  


 

 「セット と サブセット」 を TM のなかに導入した理由は、セット (集合) が 「正しい集合」 になっているかどうかを検証するためでした──「セット と サブセット」 は、(TM として改良される前の) T字形 ER手法にも導入されていました。

 「セット と サブセット」 を考える際に、それらの 「妥当な」 構成として、数学の 「分割・細分」 概念を使いました──「切断」 概念を使ったと言ってもいいでしょう。すなわち、ひとつの セット は、「まじわりのない (共通集合のない)」 複数・多数の サブセット に切断されるということです。言い換えれば、サブセット のあいだには、排他的 OR 関係が成立するということです。

 事業過程・管理過程のなかで認知された 「個体 (entity)」 に対して 「区分 コード」 を使って、「個体」 を さらに詳細に管理している場合が多い──たとえば、営業所 コード を付与された 「営業所」 の集合に対して、営業所区分 コード を導入して、営業所のなかみを さらに詳細に [ 国内営業所なのか海外営業所なのかというふうに ] 管理しているとか、従業員番号を付与された 「従業員」 の集合に対して、従業員区分 コード を導入して、従業員のなかみを さらに詳細に [ 正社員なのか パート なのかというふうに ] 管理しているなど。

 「区分 コード」 は、或る管理対象に対する さらに詳細な 「管理の視点」 を示しています。そして、この 「区分 コード」 が その個体の (セット) 部分集合 (サブセット) を示しています。したがって、「区分 コード」 を前提にして サブセット を作れば良いということです。

 サブセット に対して、「切断」 概念を適用するので、サブセット のあいだには 「まじわりがない」 ことを前述しました。TM が 「セット と サブセット」 を導入した理由は、まさに、サブセット のあいだに 「まじわりがない」 ことを確認するためにでした──逆に言えば、もし、サブセット のあいだに 「まじわり」 があれば、「場合分け」 を配慮した 「区分 コード」 を構成しなければならないことになるでしょう。たとえば、或る集合において 3つの部分集合 { A, B, C } を考えてみます──もし、「まじわり」 を考慮した部分集合を考えれば、以下のように、最大で 8つ (23) の部分集合を考えなければならないでしょう。

 { A } { B } { C } { A, B } { A, C } { B, C } { A, B, C } { φ }.

 これらの 「すべての場合分け」 に対して、「区分 コード」 を付与することは、まず無いでしょう。というのは、そういう付値は非効率だし、拡張性に乏しいから。

 ところが、「まじわり」 が、一見、起こらないように 「区分 コード」 が付値されているようでも、「まじわり」 が起こる場合があります。たとえば、「取引先」 entity に対して、「取引先区分 コード」 を用意しているとしましょう。そして、「取引先区分 コード」 の付値として、「1」 を 「納入先」 として、「2」 を 「出荷先」 として、「3」 を 「支払先」 としましょう。この状態は、一見、「取引先」 を 3つの部分集合に分割しているようにみえるのですが、「納入先かつ支払先」 などのように 「まじわり」 が起こるかもしれない。ちなみに、前述したように、「取引先区分 コード」 の付値として、「納入先かつ支払先」 に対して、(「納入先」 「出荷先」 および 「支払先」 のほかに) 「4」 というふうに値を付与することは下手な対応でしょう。
 もし、この 「まじわり」 を放っておけば、8つ (23) の場合分けを考えた アルゴリズム を作成しなければならないので、アプリケーション・プログラム の生産性・保守性・拡張性が悪くなるでしょうね。

 したがって、サブセット のあいだに 「まじわり」 が起こるのであれば、しかるべき対応をしなければならないということです。事業過程・管理過程で使われている 「管理の視点 (区分 コードの適用)」 が、かならずしも、データベース の データ 構造として妥当であるとは限らない。そのために、「区分 コード」 の妥当性 (データベース のなかに実装する データ 構造として、「集合」 概念に照らしての妥当性) を調べるのが 「セット と サブセット」 という テクニック です。ちなみに、サブセット のあいだの 「まじわり」 を除去すれば、データ 演算は、単純な集合論演算で終えることができます (後日に説明します)。

 なお、TM では、「赤本」 で示したように、「セット と サブセット」 は、以下の 2つの クラス を扱います。

 (1) 同一の サブセット
 (2) 相違の サブセット

 「同一の サブセット」 は全域関数ですが、「相違の サブセット」 は部分関数です。言い換えれば、「相違の サブセット」 は、サブセット を示すと同時に、 null を除去しています。 □

 



[ 補遺 ] (2017年11月 1日)

 モデル 作りを専門にしている或る コンサルタント が、「サブセット 間で AND が生じて何が悪い、現実には 『区分 コード』 が そういうふうに使われているではないか」 と私を (私の面前で) 非難していた。私は、こういう非難を聴くと、ウンザリ する──「専門家であるならば、もう少し数学 (論理) を学習してください」 と皮肉の ひとつでも言いたくなる。

 確かに 「現実には (『区分 コード』 で切断される) サブセット 間に 交わりがある」。しかし、私の言いたいのは、それを 「形式的構造 (モデル)」──「論理」 では、「形式的」 という意味は 「論理的」 ということ──のなかに持ち込むな、ということです。我々 システム・エンジニア は、事業を コンピュータ に実装することを仕事にしています。そして、コンピュータ は 「論理」 の集積路です。だから、「論理」 に反する事態は、「論理」 上 妥当な形に変換して実装しなければならないのは当然のことでしょう。

 サブセット 間に交わりを認めるということは、「同値類」 という概念をわかっていない──同値類がわかっていれば、サブセット 間に交わりを認めていけないことは、 3行で証明できることです。たとえば、K という集合 (セット) を考えて、K(a) と K(b) の 2つの サブセット を考えてみます──もし K(a) と K(b) が共通の メンバー c をもっていれば (すなわち、K(a) と K(b) の境界上に c があれば)、K(a)〜c, K(b)〜c。 対称律を使って、K(a)〜c, c〜K(b)、ゆえに、K(a)〜K(b)。証明終わり。K(a) と K(b) に交わりがあれば、K(a) と K(b) は、形式上、サブセット にならない。






  << もどる HOME すすむ >>
  目次にもどる