Database 如何指定引用其他两个弱实体的弱实体,这两个弱实体共享第四个实体?

Database 如何指定引用其他两个弱实体的弱实体,这两个弱实体共享第四个实体?,database,database-design,many-to-many,Database,Database Design,Many To Many,问题的标题可能有点晦涩,但我想不出一个有意义的简短版本 所以我有一个Booking表,它是客户和事件之间的多对多关系。我还有一个event\u activity表,它是event和activity之间的多对多关系 我现在希望预订能够指定它要参加的活动的哪些活动。所以我有booking\u event\u activity,这是booking和event\u activity之间的多对多 显然,booking\u event\u activity将需要外键来Customer和activity(这也

问题的标题可能有点晦涩,但我想不出一个有意义的简短版本

所以我有一个
Booking
表,它是
客户
事件
之间的多对多关系。我还有一个
event\u activity
表,它是
event
activity
之间的多对多关系

我现在希望预订能够指定它要参加的活动的哪些活动。所以我有
booking\u event\u activity
,这是
booking
event\u activity
之间的多对多

显然,
booking\u event\u activity
将需要外键来
Customer
activity
(这也是它自己的复合主键的一部分),但是如何指定最终的外键,它将是一个事件的主键?我能做到:

  • 预订活动外键的外键
  • 事件\ U活动的事件外键的外键
  • 两个外键,每个外键对应一个外键。和2
  • 直接指向事件表主键的外键

  • 您可以使表
    booking\u event\u activity
    引用customerId、eventId和activityId列。您的eventId列(至少使用SQL Server)可以是
    event\u活动
    预订
    的外键引用,但请小心!使用此方法时,级联关系可能无法按预期工作。

    您可以使表
    booking\u event\u activity
    引用customerId、eventId和activityId列。您的eventId列(至少使用SQL Server)可以是
    event\u活动
    预订
    的外键引用,但请小心!使用此方法时,级联关系可能无法按预期工作。

    我认为您的数据组织不正确。您的event_activity表可以有自己的主键,独立于事件和活动的复合索引,预订表可以将其作为外键引用。@JeremyHolovcs这会起作用,但这是家庭作业,我不允许引入任何代理键。因此,event_活动的PK必须是其两个fk的组合。这就是你的意思吗?你知道我是如何解决最初的问题的吗?那是一个丑陋的数据库设计(也是一个糟糕的家庭作业问题),但在这种情况下,您将无法同时使用eventid和activityid列作为预订表中event_activity表的外键引用。@JeremyHolovcs好吧,预订和event_activity之间存在多对多关系,因此预订不能有您刚才提到的两个FK。预订活动可以有:1)FK to booking的FK to customer,2)FK to event_活动的FK to activity,3)FK to event_活动的FK to event。但问题是,预订活动仅引用预订PK的一半,因为它仅通过活动活动引用事件。嗯,在多个(2+)表之间可以有多对多关系。没有法律禁止这样做。我认为你的数据组织不正确。您的event_activity表可以有自己的主键,独立于事件和活动的复合索引,预订表可以将其作为外键引用。@JeremyHolovcs这会起作用,但这是家庭作业,我不允许引入任何代理键。因此,event_活动的PK必须是其两个fk的组合。这就是你的意思吗?你知道我是如何解决最初的问题的吗?那是一个丑陋的数据库设计(也是一个糟糕的家庭作业问题),但在这种情况下,您将无法同时使用eventid和activityid列作为预订表中event_activity表的外键引用。@JeremyHolovcs好吧,预订和event_activity之间存在多对多关系,因此预订不能有您刚才提到的两个FK。预订活动可以有:1)FK to booking的FK to customer,2)FK to event_活动的FK to activity,3)FK to event_活动的FK to event。但问题是,预订活动仅引用预订PK的一半,因为它仅通过活动活动引用事件。嗯,在多个(2+)表之间可以有多对多关系。没有法律禁止这样做。我会记住这一点,而且这不是一个适合现实世界的理想设计。谢谢你的帮助!我会记住这一点,而且这不是一个适合现实世界的理想设计。谢谢你的帮助!