想象一下,我有一个表events
,它outdoor_events
继承indoor_events
自。我有activities
然后outdoor_activities
和indoor_activities
。假设室外和室内是完全不同的结构是有意义的,尽管我对其他建模方式感兴趣,而不是这种继承。
如果我想保留所有活动都链接到一个事件的属性,最直接的方法似乎是在 to 中使用外activities
键events
。
如果我想将户外活动限制为户外活动,室内活动也是如此,则在每个孩子中放置一个外键更有意义。然而,每个活动都必须与一个事件相关联的事实留给了表的孩子来实现。
我可以两者都做,但是最简单的形式对我来说不是一个可接受的选择,因为它没有标准化并且使用哪个键是不明确的——如果它们不同怎么办?
对我来说,第二种选择更有意义,因为它听起来更强大,并且可以通过适当的实施来满足这两个条件。
我可以做些什么来确保这两个属性都得到满足?还是这种结构在原则上有缺陷?
注意:我不认为这是Using the same table for entities...的重复,因为该问题没有解决配对相似继承表的问题。
对于表继承,根实体上通常有一个“类型”,显示为该键填充了哪个派生实体。对于此示例,它类似于 events.event_type,其值为“indoor”和“outdoor”。活动也是如此。
扩展外键(以及引用表中的相应主键)以包含此类型。使外键列不为空,第一个目标就实现了。
你说“我想约束”,你选择的短语是恰当的。大多数 DBMS 支持表约束,据此可以声明系统将在写入数据时强制执行的布尔条件。在这种情况下,它将类似于
activity.activity_type == activity.event_type_fk
。现在一个活动和它的事件的类型必须匹配,即 in 到 in 或 out 到 out,满足第二个要求。