Softwareという名前のエンティティと、2つのサブタイプFreeSoftwareとNonFreeSoftwareがあるとします。 NonFreeSoftwareエンティティには、購入日、ベンダーなどの属性があります。FreeSoftwareエンティティには、ライセンス、ソースコードのURLなどの属性があります。
それで、別のエンティティであるOperatingSystemをモデル化したい場合、どうすればよいですか?ソフトウェアには「ある」関係がありますが、FreeSoftwareおよびNonFreeSoftwareには「どちらかまたは両方」の関係があります。
この階層を分析する方法に何か欠けていると思います。
これを管理する方法は、サブタイプがスーパータイプによって決定される必要があることです(つまり、サブタイプのPKは、サブタイプからスーパータイプへのFKでもあります)。
問題は、何かが本当に相互に排他的であるかどうかを理解することです。サブタイプの属性はそれらのサブタイプにのみ適用されますが、一部のサブタイプは相互に排他的であり、一部は相互に排他的でない場合があります。
相互に排他的なサブタイプがある場合は、スーパータイプのパーティション属性を使用して、(2つ以上の)相互に排他的なサブタイプのどれを適用するかを指定できます。このパーティショニング属性は、制約またはトリガーと共に使用して、相互排他性を適用できます。
相互に排他的ではないサブタイプがある場合、パーティション属性を使用せずにそれらを存在させることができます。
次のデータモデルについて考えてみます。
3つのスーパータイプがありますが、FREE_SOFTWARE
フラグのパーティション属性に基づいて、NON-FREE_SOFTWARE
タイプとSOFTWARE.free_not_free
タイプは相互に排他的です。ソフトウェアが無料であるかどうかに関係なく、特定のソフトウェアもOPERATING_SYSTEM
になる可能性があります。
OperatingSystemが完全に新しいエンティティになるのはなぜですか?それはそれがそうであるので、それはソフトウェアのものに分類されるべきです。また、OS(クローズドソースの場合)には購入日、ベンダーなどがあります。オープンソースOSには、ライセンス、ソースコードURLなどがあります。
私はSoftwareType
またはそれらに沿った何かとの関係をお勧めします。このとき、ソフトウェアがOS、アプリケーション、またはサポートしている他の種類のソフトウェアのいずれであるかを指定できます。