2006年 8月16日 応用編-14 サブセット の擬態 (その 1) >> 目次に もどる
2011年 7月16日 補遺  


 本節では、サブセット の 「まじわり」 を扱っている。

 セット と サブセット は、数学上、「同値類」 である。そして、同値類に対して、「分割と細分」 を適用した考えかたを、ベーシック (432ページ 参照) で示した [ 以下に、「分割と細分」 に関する記述を再録する ]。

分割 (partition、あるいは、類別)

 集合 A の部分集合の族を考えてみる (集合を メンバー とする集合のことを集合族という)。集合族 π が、以下の 2つの条件を満たすなら、π を A の分割 (partition) あるいは、類別 という。

  (1) S ∈ π ∧ T ∈ π ∧ S ≠ T ⇒ S ∩ T = φ.
  (2) A = ∪ S.
        S∈π

 そして、分割 (類別) の メンバー である集合のことを 「」 という。
 数式を使って記述すると、ややこしいように感じるかもしれないが、上述した式が示していることは、単純に言えば、以下の意味である。

  (1) A は、「集合の集合」 である。
  (2) π は、A の部分集合を集めた全体である。
  (3) π は、S と T から構成される。
  (4) S と T は、交叉しない。

 つまり、A は、同値関係によって、同値類 (S と T) を「類」として、類別されることを言っている。
 そして、A 上の同値関係R による同値類全体の作る集合 (集合族 π) を A/R というふうに記述して、A の R による商集合 という。

 
細分 (refinement)

 R1 と R2 が、A 上の同値関係である、とする。
 そして、∀ x, y ∈ A に対して、xRy1 ⇒ xRy2 が成立するならば、R1 は R2 の 「細分」 である、という。
 すなわち、∀ x ∈ A について、[ x ]R1 ⊆ [ x ]R2 であり、R2 の同値類は、R1の同値類いくつかの和集合となる。言い換えれば、A/R1 ⊆ A/R2 のこと。

 以上のような言いかたをすれば、ややこしいように感じるが、単純に言えば、A/R1 と A/R2 は、(同値関係だから、) 総数 (cardinality) が同じであって、A/R1 は、A/R2 を、さらに、こまかに、仕切った状態 (集合族) である、と考えればよい。

 
分割と細分を、T字形風に記述すれば...

                     ┌─────┐
                     │     │
                     │     │
                     └──┬──┘
                        │
                    ┌───┴───┐
                    │       │
            分割   ┌──┴──┐ ┌──┴──┐
           ──────┼─────┼─┼─────┼──→
          │      │     │ │     │
          │      └──┬──┘ └─────┘
        細分│         │
          │     ┌───┴───┐
          │     │       │
          │  ┌──┴──┐ ┌──┴──┐
          │  │     │ │     │
          │  │     │ │     │
          │  └─────┘ └─────┘
          ↓

 
 したがって、T字形 ER手法 (TM および TM’) では、サブセット の交叉を認めていない。

 
 実地の データ 設計では、サブセット は 「区分 コード」 を使って示される。
 「区分 コード」 は、「管理の視点」 を示している。その 「管理の視点」 が データ 構造として妥当かどうか──「周延」 しているかどうか (正しい集合になっているかどうか)──を検証しなければならない。

 というのは、もし、「周延」 していなければ──もし、サブセット のあいだに 「まじわり」 が起これば──、プログラム は、アルゴリズム のなかで、nested-IF を使って、データ を周延しなければならないから。たとえば、「黒本」 の例で云えば、もし、取引先区分 コード が 9つの値をもっていて、かつ、それらの 値 のなかに 「まじわり」 が起こるとすれば、プログラム は、アルゴリズム として、29 の判断 (nested-IF) を用意しなければならない。しかし、データ が周延していれば、リレーショナル 代数演算として、1つの select 文を作成すれば良い。

 サブセット の 「まじわり」 は、プログラム の複雑性 (cyclomatic complexity) を増大している悪因である。したがって、サブセット のあいだに 「まじわり」 がないことを検証して、プログラム の アルゴリズム が無駄な コントロール・フロー をふくまないようにしてほしい。 □

 



[ 補遺 ] (2011年 7月16日)

 本 エッセー のなかで使っている数学的説明 「分割と細分」 は、(執筆年から判断して、) 「赤本」 の頃に使っていた論証だと思います。今は、もっと簡単な説明 (「切断」 概念、デデキント 氏が実数を定義するときに使った概念) を使っています。ちなみに、「切断」 概念を使うようになったのは、「いざない」 を出版した後だと記憶しています──「いざない」 も、「分割と細分」 を使っているので。







  << もどる HOME すすむ >>
  「T字形ER データベース設計技法」を読む