web-dev-qa-db-ja.com

「どちらか一方」の関係をモデル化するにはどうすればよいですか?

Softwareという名前のエンティティと、2つのサブタイプFreeSoftwareとNonFreeSoftwareがあるとします。 NonFreeSoftwareエンティティには、購入日、ベンダーなどの属性があります。FreeSoftwareエンティティには、ライセンス、ソースコードのURLなどの属性があります。

それで、別のエンティティであるOperatingSystemをモデル化したい場合、どうすればよいですか?ソフトウェアには「ある」関係がありますが、FreeSoftwareおよびNonFreeSoftwareには「どちらかまたは両方」の関係があります。

この階層を分析する方法に何か欠けていると思います。

12
jl6

これを管理する方法は、サブタイプがスーパータイプによって決定される必要があることです(つまり、サブタイプのPKは、サブタイプからスーパータイプへのFKでもあります)。

問題は、何かが本当に相互に排他的であるかどうかを理解することです。サブタイプの属性はそれらのサブタイプにのみ適用されますが、一部のサブタイプは相互に排他的であり、一部は相互に排他的でない場合があります。

相互に排他的なサブタイプがある場合は、スーパータイプのパーティション属性を使用して、(2つ以上の)相互に排他的なサブタイプのどれを適用するかを指定できます。このパーティショニング属性は、制約またはトリガーと共に使用して、相互排他性を適用できます。

相互に排他的ではないサブタイプがある場合、パーティション属性を使用せずにそれらを存在させることができます。

次のデータモデルについて考えてみます。

ERD

3つのスーパータイプがありますが、FREE_SOFTWAREフラグのパーティション属性に基づいて、NON-FREE_SOFTWAREタイプとSOFTWARE.free_not_freeタイプは相互に排他的です。ソフトウェアが無料であるかどうかに関係なく、特定のソフトウェアもOPERATING_SYSTEMになる可能性があります。

8
Joel Brown

OperatingSystemが完全に新しいエンティティになるのはなぜですか?それはそれがそうであるので、それはソフトウェアのものに分類されるべきです。また、OS(クローズドソースの場合)には購入日、ベンダーなどがあります。オープンソースOSには、ライセンス、ソースコードURLなどがあります。

私はSoftwareTypeまたはそれらに沿った何かとの関係をお勧めします。このとき、ソフトウェアがOS、アプリケーション、またはサポートしている他の種類のソフトウェアのいずれであるかを指定できます。

1
Thomas Stringer