1つのentityの中に複数の区分コードがある時、サブセットの階層をどうやって作成するか (1)

こういう場合、最初に教わるルールはこうだ:

1つのentityの中に、複数の区分コードがあるなら、大きいサブセットが小さいサブセットを含むように作図する

例えば顧客の属性に「個人・法人区分」「性別」があるのであれば、

  1. 顧客を個人と法人に分解
  2. 個人を男性と女性に分解

すればよい。
でも、このルールだけでは作図できないケースがあるのは明らかだ。

区分が階層になってなかったらどうするの

上のケースでは、たまたま2つの区分コードに「含む」「含まれる」の関係があるから作図できるのだが、
2つの区分が直交していたら、サブセットの生成ができなくなってしまう。
例えば、顧客の属性に「個人・法人区分」「優良顧客・不良顧客区分」があったらどうか。
{ 優良個人, 優良法人, 不良個人, 不良法人 }の4通りの顧客が発生するが、これをどうやって作図し、どうやって実装すればよいだろうか。


その回答が、ここに示されている(Rothkoさんありがとうございます)。
http://www.sdi-net.co.jp/tm-note-20041216.htm
2週間ぐらい前にざっと読んで分かったような気になったが、実地で適用しようとすると迷う例が続々と出てくる。
一人で考え込んでいてもいつまでもエントリできないので、分かっていないのを丸出しにしつつ前に進むことにする。


背景の理論を省略して作図方法だけ書くと、

  • T字形ERにおいては、1つのentityを複数の視点でサブセット化することはない。
  • 複数の視点のうち、本当の意味で包摂関係にある概念のみを使ってサブセットを生成する。それ以外はVEにする。

ということになる。
「個人・法人区分」「優良顧客・不良顧客区分」の例で言うと、個人・法人区分がサブセット化の対象で、優良顧客・不良顧客区分は顧客entityのVE扱いにすると思われる。

今後の課題

サブセット or VEの根拠は?

では、2つの区分コードの扱いの違いは、どういう根拠に基づくのか。
「本当の意味で包摂関係にある概念」とは何ですの。
リンク先を読むと何となく分かるのだが、私でも分かる言葉できちんと定義できない。
これを明らかにすることが次の課題になる。

やっぱり、階層が複数方向あったら?

さらに、「本当の意味で包摂関係にある概念」が1つのentityに複数存在したら、「ニセモノはVEで処理する」だけでは問題は解決しないことになる。
そういう困った事態が絶対に起きない保証があるのだろうか。
この点の確認をそのまた次の課題とする。

これも多分同じ問題

ちょっと前に読んだ「ソフトウェアの匠」の羽生田栄一さんのパートに、重要そうなんだけどぜんぜん理解できない箇所があった。
これ、上記のリンク先と同じ問題を扱っていると思う。
P-66に

あるクラスを汎化階層で定義すべきか、それともクラス同士の関連・集約で定義すべきか、という議論に示唆を与えてくれるのが修飾の区別です。
「削減的修飾関係」と「加算的修飾関係」です。
削減的修飾には「育ての母」「代理母」などが、加算的修飾には「若い母親」「怒っている母親」などがあります。

とあるのだが、削減的・加算的の境目が分かりそうで分からないのだ。
同書では is-a-kind-of の関係にあるものが削減的であるとされていて、

「母親は若者の一種です」は成り立ちません。*1

ということをもって、「若い母親」を加算的修飾に分類している。
いや、何となく分かりますよ。でも「代理人は母親の一種です」も成り立ってないような...
この話の意味が分かれば、「個人・法人区分」と「優良顧客・不良顧客区分」の違いも分かるような気がする。

*1:これ、「若者は母親の...」の間違いではなかろうか