2003年 9月 1日 非正規形と事業解析 [(D) の扱い ] >> 目次 (作成日順)
  ● QUESTION   データ 構造では、データ 重複は、絶対に許されないのか。
  ▼ ANSWER   そんなことはない。 導出項目 (たとえば、「在庫」) を実装することがある。
2008年 9月16日 補遺  



非正規形には、「複写 (replication)」 と 「導出 (derivation)」 がある。

 データ 設計では、「論理設計」 と 「物理設計」 という 2つの段階を考慮することが多い。
 「論理 (logical)」 というのは、「特定の」 ハードウェア や OS や ソフトウェア (たとえば、DBMS) を考慮しないことをいい、「物理 (physical)」 とは、具体的な(言い換えれば、「実際に使っている」) ハードウェア や OS や ソフトウェア の機能を加味して 「論理」 を調整することをいう。

 システム・エンジニア が目的としなければならない点は、「論理=物理」 を実現することにある。そのために、エンジニア として、技術を駆使するのである。ただ、データベース は、技術的な ツール であると同時に セールス の プロダクト でもある。最高級の機能を搭載している ツール が、かならずしも、プロダクト として普及する訳ではない。言いかたを換えれば、データベース を導入する ユーザ 企業でも、「費用対効果」 を加味して、プロダクト を選ぶ。つまり、限られた投資のなかで、プロダクト を選ぶ。
 したがって、高 パフォーマンス を実現する機能を搭載した最高級の データベース が、かならずしも、導入されている訳ではない。

 逆に言えば、データ の正規形が崩されれば崩されるほど、データベース の性能が悪い (あるいは、システム・エンジニア の技術力が悪い)、と判断してよい。

 ただ、「完全な」 正規形を実装することは (現時点では) あり得ない、と思ってよい。非正規形には、以下の 2つがある。

   (1) 導出項目 (derivation)
   (2) 複写 (duplication)

 
[ 参考 ]
 非正規形には、以上の 2つのほかにも、「多義 (繰返項目)」 や 「サブセット の まじわり (AND 関係)」 も あるが、いずれも、「事実」 そのものが交錯している状態である──したがって、「形式的構成」 では、なんらかの対応をしなければならないが、本 ページ の テーゼ と離れるので、その対応の説明は割愛する (「FAQ」 のなかの しかるべき ページ を参照されたい)。「事実」 を起点にして、「事実」 から導き出される項目として、以上の 2つ (導出項目と複写) を典型例として扱う。

 
「導出項目 (derivation)」 は、データ 項目として定義することがある。

 たとえば、「在庫残高 (誘導法を使った帳簿記録)」 は導出項目である。したがって、「完全な」 正規形のなかでは、定義してはいけない。しかし、企業の設立時点から現時点に至るまで、入庫 トランザクション のすべてと出庫 トランザクション をすべてを対象にして在庫残高を計算することは 「現実的」 ではない。いっぽうで、(制度会計上、公認会計士の) 実査立会があるので、期末の在庫残高を 「事実 (データ)」 として認知するのが普通である。
 「完全な」 正規形では、かりに、期首の在庫残高を 「事実」 として認知しても、期中の在庫残高は導出項目なので、(在庫残高を データ 項目として定義しないで) 計算することなる。しかしながら、そうすれば、「在庫引当」 に対応することがむずかしい。

 したがって、在庫残高という導出項目を データ 項目として定義するのが (事業のなかでは) 「健全な」 措置である。ただし、「在庫」 ファイル が、データ 構造のなかで、いきなり、記述されているのは適切ではない。「在庫」 は、データ 構造のなかでは、倉庫と棚と製品から導出される テーブル であり、在庫残高 (数量) は、入庫 (入荷) と出庫 (出荷) と倉庫間移動と (減耗などの) 調整から導出される項目である。それらの導出関係が、データ 構造のなかで、記述されていなければならない。

    「在庫 (倉庫. 棚. 製品. 対照表)」
    {倉庫 コード (R)、棚番号 (R)、製品 コード (R)、DATE、数量 (D)

 (D) は、derivation の略である。ちなみに、「倉庫. 棚. 製品. 対照表」 が、データ 構造上の導出を記述しており、数量 (D) が、計算上の導出を記述している。

 
「複写 (replication)」 も 「事実」 からの 「導出 (derivation)」 である。

 データ 重複に関しては、たとえば、以下の データ 構造を例にする。

 [ 例-1 ]

 品目 {品目番号、品目名称、単価} [ R ]
 受注 {受注番号、品目番号 (R)、受注日、受注数} [ E ]

 
 [ 例-2 ]

 品目 {品目番号、品目名称} [ R ]
 受注 {受注番号、品目番号 (R)、受注日、受注数、単価} [ E ]

 
 [ 例-3 ]

 品目 {品目番号、品目名称、単価} [ R ]
 受注 {受注番号、品目番号 (R)、受注日、受注数、単価} [ E ]

 
 以上の 3つの例では、単価が帰属している entity がちがう。
 「例-1」 では、品目という 「resource」 のなかに単価が帰属しているので、単価は 「定価」 を意味しているし (──製造なら、標準原価を意味しているし──)、「例-2」 では、受注という 「event」 のなかに単価が帰属しているので、単価は 「時価 (オープン・プライス)」 を意味している (──製造なら、実際原価を意味している)。「例-3」 では、単価は品目にも受注にも定義されているので、定価がきめられているが、営業の判断次第で、値引きができることを意味している (──製造なら、標準原価と実際原価の ふたつを適用して、原価差異を計算することを意味している)。

 T字形 ER手法が 「正規形 (T字形ER手法がいう正規形)」 を大切にする理由は、「正規形=事業解析」 を実現する点にある。つまり、「正規形を読めば、事業を判断できる」 という点をT字形 ER手法は目的としている。

 たとえば、或る企業では、「例-1」 が 「事実 (事業の実態)」 であった、とする。しかし受注の データ 件数が膨大なので、いちいち、品目に アクセス して単価を入手すれば、データベース の高 パフォーマンス を実現できない、というふうに システム・エンジニア が勝手に判断して、品目の単価を受注のなかに複写して、以下の データ 構造を生成したとする。

 品目 {品目番号、品目名称、単価} [ R ]
 受注 {受注番号、品目番号 (R)、受注日、受注数、単価} [ E ]

 
 この データ 構造を読めば、(「事実」とは違う) 事業形態を想像してしまう。一人の システム・エンジニア の価値観のために、「事実」 を歪曲しないでほしい。もし、データベース の性能が悪いので、高 パフォーマンス を実現できないのであれば──ただし、品目番号を対象にして、「INDEX-only」 を使って、受注と品目を join すれば、高 パフォーマンス を実現できるのだが──、「複写」したことを示すために、以下のような記述にしてほしい。

 品目 {品目番号、品目名称、単価} [ R ]
 受注 {受注番号、品目番号 (R)、受注日、受注数、単価 (D)[ E ]

 
 T字形 ER図では、複写 (replication) も、「事実」 から導出された項目として扱う。
 T字形 ER図では、「事実」 と 「事実以外」 を混同しないようにして記述し、「事実以外」 が、(単純な) 複写項目なのか、あるいは、計算式を使う導出項目なのか、という点は アトリビュート・リスト で記述する。

 



[ 補遺 ] (2008年 9月16日)

 本 エッセー のなかで、「事実」 という語が使われていますが、「『事実』 とは いかなることを云うのか」 は、争点になります。ここでは、常識的な解釈として、「事実」 を 「時間・空間のなかでみいだされる実在的な出来事あるいは存在」 としておきましょう。具体的には、以下の 3つの個体を云います。

  (1) 持続する現実的な事物
  (2) 生起する現実的な事物
  (3) 反復する抽象的な事物

 「反復する抽象的な事物」 は、「実在」 ではないのではないかと思われますが、たとえば、われわれは、事業過程・管理過程のなかで、「カラー・コード」 を個体指定子にして 「カラー (色)」 を認知していますし、「サイズ・コード」 で 「サイズ (寸法)」 を認知していますし、「分類 コード」 で 「分類」 を認知しています。ただ、「色」 「寸法」 「分類」 などは単独で存在しないで、ほかの個体に付属する性質を言及する語か、あるいは、個体に対する行為を言及する語ですが、そういう概念あるいは行為 (物理的対象の性質あるいは関係) が、適当な条件の下で、与えられた事態のなかに現れるか現れないかという点を直接の観察によって確かめられます。そういう 「(物理的対象の性質 [ あるいは関係 ] の) 観察可能な特徴」 を ひとつの対象として認知したにすぎないので、「事実」 とみなして良いでしょう。

 さて、そういうふうに 「事実」 を解釈すれば、「導出項目」 および 「複写項目」 は、いずれも、「『事実』 からの」導出・複写であって、「事実」 ではないでしょうね。導出も複写も、存在ではなくて、演算です。演算は、「事実」 に対する オペレーション (関数) であって、「構成する」 行為です。「事実」 を 「項」 として扱います──たとえば、p とか q とか。そして、オペレーション は、「事実」 に対して 「形式的構造」 を作る 「推論 (あるいは、式)」 であって、式で構成された構成物も項です──たとえば、p ∧ q とか、p ∨ q とか、p → q とか、p に対する ¬p とか。言い換えれば、式で構成された項は、事実の項に至るまで 「解析」 できるということです。しかも、項を作る式──無矛盾な式──は、同値になるように、いくつも作ることができます──たとえば、p → q に対して、¬(p ∧ ¬q) と ¬p ∨ q は同値であって、いずれを使ってもいいでしょう。したがって、「演算 (および、演算で構成された項)」 を 「事実」 と混同しないようにします。

 演算で構成された項の典型的な例が 「在庫」 でしょうね。「在庫」 は、「倉庫」 「棚」 および 「商品」 とのあいだで構成される概念です。では、「在庫」 は、導出項目なので、構成のなかに記述しないのか といえば、記述するのが ふつうでしょうね──その理由は、本 エッセー のなかで述べました。私は、「在庫」 が導出項目であると記述しましたが──たしかに、「在庫」 は導出項目ですが──、いっぽうで、「棚卸し」 という事態に対応する 「事実」 であるというふうに 「解釈」 することもできます。たとえば、以下の構成を考えてみましょう。

  { 倉庫 コード (R)、棚番号 (R)、商品番号 (R)、棚卸日、数量 }.

 すなわち、この 「対照表」 のなかに、「日付」 を定義すれば、この 「対照表」 は、「棚卸し」 という現実的事態に対応する 「F-真」 を満たしている、ということです。すなわち、以下の 「T-文」 を満たす、ということです。

  言明 p が真であるのは、時刻 t において、事態 q と対応するとき、そして、そのときに限る。

 「在庫」 の記録として、帳簿記録法 (継続記録法) と棚卸法 (実査) がありますが、帳簿記録法では 「L-真」 が問われ、棚卸法では 「F-真」 を問われるでしょうね。

 TM は、「真」 概念を重視した体系になっているので、基本的に、「F-真」 を満たす個体のみを実装するのが正しいのですが、「L-真」 の対照表も ほとんど実装しています。ただし、「L-真」 の対照表を実装する理由は、プログラム のなかで 巾集合に対応する (あるいは、集合族に対する) アルゴリズム を構成するのが面倒なので──プログラム の生産性・保守性が悪くなるので──、データ に対する単純な関数引きで対応するという便法であって、ロジック では 「L-真」 は アルゴリズム で構成するか あるいは、Data Dictionary で定義するのが正しいことを注意しておきます。

 導出項目と複写項目は、「(正当な) 演算」 と 「(重複を起こす) 複写」 という違いがあるのだから、それらを一律に (D) として扱わないで、複写項目には (C) という べつの標識を付与して注意を促すべきではないか という意見をいただくことが多いのですが、TM にとって、「事実」 以外は すべて、「事実」 に対する補集合であって──そして、その補集合を TM は個体として認めないので──、補集合の元を さらに分割・細分することは無意味でしょうね。




  << もどる HOME すすむ >>
  データ解析に関するFAQ