许多fk表的一个表列?

时间:2011-04-06 09:22:35

标签: database database-design foreign-key-relationship database-normalization database-table

这种情况的最佳解决方案/做法是什么? 我有一个表,可以引用多个表(对象)?

以下是表UserCalendar的示例。这是一个用户保存事件的表,也是从后面插入此表的系统。用户执行一些服务,这些服务有截止日期,并且也会在此表中插入。问题是UserEvent表没有这样的表。用户应将此日历中的所有事件保存为描述。我应该尽可能简化。

我可以这两种方式设计。

1)

  

UserCalendar
      UserCalendarId | UserId |说明| ObjectType |的ObjectId

使用此选项,我不必FK这个表。我只能更改ObjectType(通知,服务,日历)并使用该表的id作为ObjectId。在Event的情况下,将没有这样的表,这将是空字段。 我们称之为伪FK列。

2) 或者我可以在理论上使用每个FK的多个表格。

  

UserCalendar
      UserCalendarId | UserId |说明

     UserEvent
      UserCalendarId | EventId

      用户服务
      UserCalendarId | ServiceId

      用户通知
      UserCalendarId | NotificationId
     ...

对于每个系统事件或属于某种类型的任何其他自定义事件,此外部关系表可以是n数字

第一个解决方案是快速实施。

1 个答案:

答案 0 :(得分:2)

我更喜欢将第三种解决方案作为两种设计的混合物:

  

UserCalendar
      UserCalendarId | UserId |描述

     

UserCalendarAttributes
      UserCalendarId | ObjectType |的ObjectId

通过这种方式,您可以随意添加任意数量的日历条目(例如事件通知),并且 UserCalendar <之间没有紧密耦合/ strong>表格和任何其他表格。

如果将FK放入主 UserCalendar 表中是有意义的,还取决于您访问其他数据(事件,服务等)的频率。

我建议灵活性性能更多,但您会略微增加架构的复杂性。功能要求发生变化的可能性要大于性能问题。