Database design 菱形关系-识别还是不识别?
我的问题与此有关: 我有一个非常类似的问题:一个场馆包含许多座位。一个场馆也举办许多活动。我需要记录每项赛事的预定座位。该信息保存在事件座位表中,该表与事件和座位都有标识关系(即其主键标识事件和座位) 我想强制执行一项限制,即活动座位中的每一行必须指向属于同一场馆的活动和座位。我考虑通过将Database design 菱形关系-识别还是不识别?,database-design,foreign-keys,relational-database,relationship,foreign-key-relationship,Database Design,Foreign Keys,Relational Database,Relationship,Foreign Key Relationship,我的问题与此有关: 我有一个非常类似的问题:一个场馆包含许多座位。一个场馆也举办许多活动。我需要记录每项赛事的预定座位。该信息保存在事件座位表中,该表与事件和座位都有标识关系(即其主键标识事件和座位) 我想强制执行一项限制,即活动座位中的每一行必须指向属于同一场馆的活动和座位。我考虑通过将场馆id作为活动主键的一部分,将活动->场馆转换为一种识别关系,如下所示: 这样做将允许我为event\u seat定义两个外键,如下所示: (venue_id, event_id) references
场馆id
作为活动
主键的一部分,将活动->场馆转换为一种识别关系,如下所示:
这样做将允许我为event\u seat
定义两个外键,如下所示:
(venue_id, event_id) references event(venue_id, event_id)
(venue_id, seat_id) references seat(venue_id, seat_id)
这一定义将保证所需的限制(活动必须在座位所属的同一地点举行)。然而,
场馆id
实际上是活动id
的一个函数,因此(场馆id,活动id)
不是最小的超级键。这是否违反了关于主键的一些基本原则?我还有什么其他选择?座位id本身不是唯一的,并且在功能上不依赖于场馆id
(反之亦然)。这就是为什么你应该把它命名为seat\u no
。与事件id
相同
如果您想要一个自身唯一的“简单”字段,那么除了由标识关系生成的复合键之外,还可以始终引入一个
或者,您可以将
seat\u id
单独作为一个键,但引入一个冗余的唯一约束,覆盖{vention\u id,seat\u id}
,仅用于被菱形的“底部”引用。感谢您的快速回答!关于seat\u id
您是对的。我应该给它改名。关于event\u id
,您是错的,但是:event\u id
本身是唯一的,应该足以识别事件。如果场馆id
独立于活动id
,我就不会对底图有任何问题。我遇到的问题是事件
和场馆
之间的关系,而不是座位
和场馆
之间的关系@RonInbar I不必是唯一的,仅基于您的车型。如果我不知道还有其他一些业务规则强制它是唯一的,那么只需将其作为代理键,并使用一个单独的字段(例如事件号
)来正确建模菱形依赖项。或者使用替代解决方案(冗余唯一)。