2021年12月15日 「12.1.1 多値の『OR 関係』」 を読む >> 目次に もどる


 多値の 「OR 関係」 は、コッド 正規形を学習した人であれば、構文論上 (第 1正規形として)、すぐに例を思い浮かぶでしょう。ここでは、構文論上の注意点を一寸 述べておきます。次の例を考えてみます──

  {商品番号、商品名称、商品単価-1、商品単価-2、・・・}.

 この例では、商品単価が多値 (配列) になっています──たとえば、商品単価-1 は 「正価格」 としての値が入り、商品単価-2 は 「割引価格」 として値が入るとします。「正価格」 と 「割引価格」 は、同時には成立しない (多値の 「OR 関係」 です)。とすれば、第 1正規形は次のようになる──

  {商品番号、商品名称、・・・}.

  {商品番号 (R)、商品単価、単価種別 コード}.

 ここで注意してほしい点は、「単価種別 コード」 です──モデル 生成の大前提として、ユーザ が使っている ことば (文字列) 以外の (定義されていない) ことば を モデル に持ち込むのは厳禁ですが、「単価種別 コード」 は ユーザ が使っていない ことば です。商品単価が配列の状態であれば、配列の物理的並びが 「意味」 をあらわしていました──配列の 1番目に置かれた値は 「正価格」 を意味して、配列の 2番目が 「割引価格」 である、と。しかし、第 1正規形では、商品単価を一価関数に正規化しました。ゆえに、配列が示していた 「意味」 がわからなくなってしまう。そのために、商品単価の並びを保証しなければならない (並びによって 「意味」 (値) を保証しなければならない)。そのために導入されているのが 「単価種別 コード」 なのです。つまり、「単価種別 コード」 は、商品単価を並べるための自然数 (その値として、1、2、・・・を充填する自然数) なのです──以前に述べた ゲーデル 数を思い出してください、「単価種別 コード」 は ゲーデル 数に似た性質の作用 (文字列と自然数を 「1 対 1」 に対応させる役割) を担っています。したがって、この 「単価種別 コード」 は (単に並べるための数値であって) 「区分 コード」 (サブセット を生成するための切断 コード) とは違うという点に注意してください。

 多値関数を一価関数として ばらばらにする理由は、モデル では 「事実 (現実的事態) を写像する」 という前提に因る。つまり、値が充足された モノ (言い替えれば、存在している モノ) しか形式的構造の対象にしていない──特に、TM は 2値論理 (値の充足ということ) 前提にしているので、すなわち 関数のなかの変数に値が充足されたならば、モノ が存在しているということを前提にしているので、事実 (F-真) のみを対象にしています。TM では、形式的構造のなかでは null を認めていない。

 正規形を作ったあとで実装するときに、往々にして、第 1正規形を崩して非正規形 (?) にする悪しき慣習があるようです──実際、SQL の国際基準 (1998年版) では、配列を認めている (SQL の正しい使いかたを示すはずの国際基準が間違った やりかた を認めるとは言語道断、なにをか云わんや!)。第 1正規形を非正規形に戻す理由は、多値が多い場合には I/O が多発して パフォーマンス を落とすということらしい。そもそも RDB が index を搭載していること自体が RDB の internals (コッド 氏の セット・アット・ア・タイム 法) とは無関係なのです! しかし、市販されている RDB が index を搭載しているので、それを逆手にとって INDEX-only を使えば、第 1正規形は配列に比べて I/O が少なくて高 パフォーマンス を実現することくらいは、関係 モデル を学習した システム・エンジニア や プログラマ なら すぐに気づくはずです。自らが使う ツール を知らないで その ツールを使うことは止めていただきだい (ツール を使うなら、ツール の トリセツ を読んでください)。 □

 




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