jl6*_*jl6 13 database-design subtypes
假设我有一个名为 Software 的实体和两个子类型 FreeSoftware 和 NonFreeSoftware。NonFreeSoftware 实体具有购买日期、供应商等属性。 FreeSoftware 实体具有许可证、源代码 url 等属性。
因此,如果我想为另一个实体(OperatingSystem)建模,我应该怎么做?与软件存在“是一种”关系,但与自由软件和非自由软件存在“非此即彼”的关系。
我想我在分析这个层次结构的方式中遗漏了一些东西。
管理这个的方法是你的子类型必须由超类型决定(即子类型的PK也是从子类型到超类型的FK。)
挑战在于了解某事是否真正相互排斥。子类型的属性应该只适用于那些子类型,但很可能一些子类型是互斥的,而另一些则不是。
如果您有一些互斥的子类型,那么您可以在超类型上使用分区属性来指示应用哪个(两个或更多)互斥子类型。此分区属性可与约束或触发器一起使用以强制执行互斥性。
如果您有不互斥的子类型,则它们可以在不使用任何分区属性的情况下存在。
考虑这个数据模型:
您有三个超类型,但FREE_SOFTWARE
和NON-FREE_SOFTWARE
类型是互斥的,基于SOFTWARE.free_not_free
标志分区属性。任何给定的软件也可能是一个OPERATING_SYSTEM
,无论它是否免费。