我应该如何模拟“非此即彼”的关系?

jl6*_*jl6 13 database-design subtypes

假设我有一个名为 Software 的实体和两个子类型 FreeSoftware 和 NonFreeSoftware。NonFreeSoftware 实体具有购买日期、供应商等属性。 FreeSoftware 实体具有许可证、源代码 url 等属性。

因此,如果我想为另一个实体(OperatingSystem)建模,我应该怎么做?与软件存在“是一种”关系,但与自由软件和非自由软件存在“非此即彼”的关系。

我想我在分析这个层次结构的方式中遗漏了一些东西。

Joe*_*own 8

管理这个的方法是你的子类型必须由超类型决定(即子类型的PK也是从子类型到超类型的FK。)

挑战在于了解某事是否真正相互排斥。子类型的属性应该只适用于那些子类型,但很可能一些子类型是互斥的,而另一些则不是。

如果您有一些互斥的子类型,那么您可以在超类型上使用分区属性来指示应用哪个(两个或更多)互斥子类型。此分区属性可与约束或触发器一起使用以强制执行互斥性。

如果您有不互斥的子类型,则它们可以在不使用任何分区属性的情况下存在。

考虑这个数据模型:

ERD

您有三个超类型,但FREE_SOFTWARENON-FREE_SOFTWARE类型是互斥的,基于SOFTWARE.free_not_free标志分区属性。任何给定的软件也可能是一个OPERATING_SYSTEM,无论它是否免费。

  • @imoatama - 已经有一段时间了,但我终于有时间在这里发布模板:https://moosewarevisioerd.codeplex.com/ 请注意,在描述中,模板的智能形状是为旧版本的 Visio 构建的,还有一些关系连接器形状的行为可能有点古怪。总有一天我会解决这个问题。 (3认同)