2011-04-08 39 views
3

对现有应用程序有一项新要求。目前,我们有一个组织表,它有一个子表CalendarEvents。现在,请求将允许用户表,组织表或分区表自己的日历事件。我在想有什么需要,因为现在发生变化,这会离开我与创建如下表结构:试图避免多个父表

  • 组织(的organization_ID)
  • 用户(USER_ID,的organization_ID)
  • 司(division_id),
  • 日历(CALENDAR_ID,的organization_ID,USER_ID,division_id),
  • CalendarEvents(calendar_event_id,CALENDAR_ID)

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

感谢您的任何输入。

+0

用户,部门和组织之间的关系是什么? – 2011-04-09 01:46:56

+0

组织对用户是1对多。部门还没有实施,但这些组织可能会有1到多个,可能有1到很多有用户,但可能多到很多。 – Ryan 2011-04-11 15:22:51

回答

2

由于用户实例和组织情况下可以有自己的事件,我会倾向于做独立的表:

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

这样,这两个实体可以控制自己的事件。另外,如果你保持结构相同,你可以在你的中间层中使用一个基类,它可以从任何一个表中加载。

1

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

+2

任何消费者曾经写过的每个查询都会尊重owner_type列的几率是多少?您无法加入此处,因此您要么在代码中编写三个查询并进行分支,要么每次执行两个查询。不用了,谢谢。 – 2011-04-08 22:57:17

+0

我也在考虑走这条路线,这本来就是我最初的解决方案的一个更清晰的版本。它仍然让我不得不在查询中写入比想要的更多的逻辑。不过谢谢。 – Ryan 2011-04-11 15:20:42

2

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

更好的解决方案,不过,可以是定义的那些的链接三个表:

UserCalendarEvents 
    user_id 
    calendar_event_id 

OrganizationCalendarEvents 
    organization_id 
    calendar_event_id 

DivisionCalendarEvents 
    division_id 
    calendar_event_id 
1

One table column for many fk tables?

and

multiple tables need one to many relationship

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

您可以通过将它们联合在一起创建“所有日历事件”视图(当然,在投影掉所有者列之后)。显然,这个观点是不可更新的。

如果您设置了三个单独的表格,并且只有“共享”事件表的“链接”,您仍然不会因“孤立”事件而被警惕。