【问题标题】:Design for a many-to-many database relationship - exactly one of which is 'special'?多对多数据库关系的设计——其中一个是“特殊的”?
【发布时间】:2015-02-14 08:19:44
【问题描述】:

我在Users 和Events 之间有一个多对多关系,使用表UserEvent。只有一位用户是活动主持人。

我可以想到两种实现方式:

1) UserEvent 有一个 host 布尔列,对于活动主持人来说是 true。

2) Event 有一个 host 列指向单个用户。

第二个选项更清楚地表明只有一个主机,但可以使用第一个选项在业务逻辑中实现(如果事件主机为 1,则不允许其他主机)。我也喜欢第一个选项,因为主机列实际上只是一个 UserEvent 关系。有没有办法实现一个约束,使得单个Event 中只有一个UserEvent 有一个true host 列?

【问题讨论】:

  • EventHost 表将每个 Event 映射到其唯一的 Host 怎么样?该表将只有主机 ID 和事件 ID。

标签: sql database database-design relational-database


【解决方案1】:

最好的办法是第二种。

一个 Event 有很多用户(M2M 关系)所以你需要一个关系表,但是 Event 到 Host 的关系是唯一的,所以映射它的地方应该是 Event 表。

在我看来,Event-Host 关系不同于 Event-Users 关系。但是,当然,在您的情况下,主机可能只是一个用户,由于某些琐碎的原因被标记为主机。

当然,您可以决定将主机信息作为标志保留在EventHost 表中,在这种情况下,您需要一个触发器来测试您每次插入或更新一行时是否已经有用户标记为主机EventHost.

一些数据库允许您使用检查约束来扫描表以查找是否已经存在主机标记用户,但大多数数据库允许您仅对正在插入/更新的行进行检查。

排序版本:

选择 2,或者,如果您想选择 1,请使用触发器。

【讨论】:

    猜你喜欢
    • 2011-05-01
    • 2012-09-30
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 2011-04-13
    相关资源
    最近更新 更多