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不必是唯一的,仅基于您的车型。如果我不知道还有其他一些业务规则强制它是唯一的,那么只需将其作为代理键,并使用一个单独的字段(例如
事件号
)来正确建模菱形依赖项。或者使用替代解决方案(冗余唯一)。