外键指向多个表的数据库架构困境(独占弧)

时间:2010-08-18 09:57:21

标签: tsql database-design relational-database foreign-key-relationship relational

希望我的描述比标题好一点,但基本上我遇到了新应用程序架构的一部分问题而且我坚持使用表格结构中最易于管理和优雅的解决方案。

仅显示相关字段的裸骨表结构如下:

  

航空公司(身份证,姓名,......)
  酒店(身份证,姓名,......)
  供应商(id,name,...)
  事件(id,name,...)
  eventComponent(id,name){例如Food Catering,Room Hire,Audio / Visual ...}
  eventFlight(id,eventid,airlineid,...)
  eventHotel(id,eventid,hotelid,...)
  eventSupplier(id,eventid,supplierid,hotelid,eventcomponentid,...)

所以航空公司,酒店,供应商都是参考表,并且创建一个事件,这些参考表之间有一对多的关系。例如,活动可能有2个航班条目,3个其他组件条目和2个酒店条目。但问题是,在EventSupplier表中,供应商可以是供应商,也可以是现有的酒店。因此,在用户在前端构建新事件之后,我需要以一种不会成为噩梦的方式存储它,然后再返回此数据。

我一直在阅读关于多态关系和独有弧线的大量阅读,我认为我的场景肯定更符合线条或独家弧关系。

我在想:

  

CREATE TABLE eventSupplier(
      id SERIAL PRIMARY KEY,
      eventid INT NOT NULL,
    hotelid INT,
    supplierid INT,
    CONSTRAINT UNIQUE(eventid,hotelid,supplierid), - UNIQUE允许NULLs     约束检查(hotelid IS NOT NULL或者supplierid IS NOT NULL),
    FOREIGN KEY(hotelid)REFERENCES酒店(id),
    FOREIGN KEY(supplierid)REFERENCES供应商(id)
  );

然后,对于这些数据的检索,只需对两个表使用外部联接,以确定哪个表是链接的。

  

选择e.id作为eventid,合并(h.name,s.name)作为供应商
  来自eventSupplier es      左外连接
     供应商s on s.id = es.supplierid
     左外连接
     酒店h on h.id = es.hotelid
  其中h.id不为空或者s.id不为空

我的其他选择是在eventSupplier表中使用一个外键,其中“type”的另一个字段似乎是一个更难以从中检索数据的解决方案,尽管如果我想将其扩展下来,它似乎非常灵活轨道没有进行架构更改。或者可以直接将hotelid存储在Supplier表中,并将一些供应商声明为“酒店”,尽管有冗余数据我不想要。

对此的任何想法都将非常感激!

干杯 菲尔

2 个答案:

答案 0 :(得分:1)

如何逐个处理事件并使用EventGroup将它们组合在一起? alt text

修改

我只是简单地重命名实体以适应最新的评论。我尽可能接近这一点 - 诚然,我不能正确理解这个问题。

alt text

答案 1 :(得分:0)

测试解决方案的一个好方法是考虑如果航空公司成为供应商会发生什么。您的解决方案是处理该问题还是开始变得复杂。

如果您不需要其他类型供应商的数据级别,为什么明确需要在供应商路线上查找酒店数据?我建议供应商是供应商,无论是否是酒店用于这些目的。

如果您想将供应商标记为酒店,那么只需将hotelid放在供应商表上,或者稍后通过您使用的任何机制等待并挂钩供应商以获取其他供应商的详细信息。