试图避免多个父表

时间:2011-04-08 22:49:25

标签: mysql database-design

现有应用程序已有新要求。目前,我们有一个组织表,它有一个子表CalendarEvents。现在,请求是允许User表,Organization表或Division表拥有日历事件。我认为有些东西需要改变,因为现在,这将让我创建下面的表结构:

  • 组织(organization_id)
  • 用户(user_id,organization_id)
  • Division(division_id),
  • 日历(calendar_id,organization_id,user_id,division_id),
  • CalendarEvents(calendar_event_id,calendar_id)

我正在尝试避免将Calendar链接到多个父级。有没有更好的方法来做到这一点,我失踪了? (组织/用户/部门可以有多个日历,但只有一个组织/用户/部门可以拥有日历)

感谢您的任何意见。

4 个答案:

答案 0 :(得分:2)

由于用户实例和组织实例可以拥有自己的事件,因此我倾向于制作单独的表:

Organization
OrganizationCalendarEvents (with FK to Organization)
User
UserCalendarEvents (with FK to User)

通过这种方式,两个实体可以控制自己的事件。此外,如果保持结构相同,则可以在中间层使用单个基类,可以从任一表加载。

答案 1 :(得分:2)

如果每个实体(用户,组织和部门)的CalendarEvents是互斥的,我可能会从三个相同的事件表开始:UserCalendarEvents,OrganizationCalendarEvents和DivisionCalendarEvents。

更好的解决方案可能是将其定义为 links 的三个表:

UserCalendarEvents
  user_id
  calendar_event_id

OrganizationCalendarEvents
  organization_id
  calendar_event_id

DivisionCalendarEvents
  division_id
  calendar_event_id

答案 2 :(得分:1)

是。有一种称为“变形”的技术适合您的情况。您的CalendarEvents表应该有一个名为“owner_type”的字段和另一个名为“owner_id”的字段。 “owner_type”表示“owner_id”是特定行的外键的表。如果owner_type为1,则owner_id为user_id;如果owner_type为2,则owner_id为organization_id。等等。

答案 3 :(得分:1)

One table column for many fk tables?

multiple tables need one to many relationship

如果您希望DBMS强制执行完整性规则,任何日历事件总是针对X,Y或Z(以及其中之一),那么您将必须创建三个表。 / p>

您始终可以通过将它们组合在一起来创建“所有日历事件”的视图(当然,在突出显示所有者列之后)。显然,该视图不可更新。

如果您设置了三个单独的表,只有一个“链接”到“共享”事件表,您仍然无法防止发生“孤立”事件。