1

希望我的描述比标题好一点,但基本上我遇到了新应用程序模式的一部分问题,表结构中最易于管理和优雅的解决方案是什么?只有相关领域的显示情况如下外键指向多个表的数据库模式困境(独占弧)

裸露的骨头表结构:

航空公司(ID,姓名,...)
酒店(ID,姓名,...)
供应商( (id,name,...)
event(id,name,...)
eventComponent(id,name){eg Food Catering,Room Hire,Audio/Visual ...}
eventFlight(id,eventid ,航空公司,...)
eventHotel(id,eventid,hotelid,...)
eventSupplier(ID,事件ID,供应商ID,hotelid,eventcomponentid,...)

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

我一直在做关于多态关系和排他弧的大量阅读,我认为我的场景绝对更多沿线或独家弧关系。

我在想:

CREATE TABLE eventSupplier(
ID SERIAL PRIMARY KEY,
事件ID INT NOT NULL,
hotelid INT,
供应商ID INT,
约束UNIQUE(事件ID,hotelid ,supplierid), - UNIQUE允许为NULL
CONSTRAINT CHECK(hotelid IS NOT NULL或supplierid IS NOT NULL),
FOREIG N KEY(hotelid)REFERENCES hotel(id),
FOREIGN KEY(supplierid)REFERENCES supplier(id)
);

然后,为了检索这些数据,只需使用两个表的外连接来计算出哪一个被链接。

从eventSupplier ES
左外选择e.id为事件ID,聚结(h.name,s.name)作为供应商
上s.id = es.supplierid
左连接
供应商小号外连接
h.id酒店h = es.hotelid
其中h.id不为空或s。ID不为空

我的另一个选择是有在eventSupplier表与其他领域的一个外键的“类型”,这似乎是一个很难解决方案中获取数据,但它似乎相当灵活如果我想在不改变模式的情况下将其扩展到轨道上。或者交替地将酒店ID直接存储在供应商表格中,并且只是将一些供应商声明为“酒店”,尽管然后存在我不想要的冗余数据。

对此的任何想法将不胜感激!

干杯 菲尔

回答

1

如何处理事件一个接一个,并使用EventGroup它们组合一起的? alt text

编辑

我只是改名为实体,以适应最新的评论。这尽可能接近我 - 我承认我不能正确理解问题。

alt text

+0

感谢ERD达米尔,我真的很感激你抽出时间来帮助我。我想我可能需要进一步澄清事件结构,因为分组方法并没有真正起到任何作用,因为每个事件本身都是一对一处理的。 例如我可能会添加一个会议,其中包含存储在事件表中的所有数据,例如审批者,所有者,组织者,日期,目的地等,然后它具有可能为0..n的附加事件组件每种组件类型。 – Phil 2010-08-18 13:59:11

+0

因此,此次会议可以有2个航班,1个酒店预订,以及来自供应商/其他的视听租赁和食品餐饮。所以我在构思方面遇到困难的部分是我如何将供应商存储为供应商或酒店,同时考虑到两者是非常不同的实体并存储完全不同的数据。希望这是有道理的? – Phil 2010-08-18 13:59:42

+0

可能是这样的:Component = food_catering,EventSource = Hotel – 2010-08-18 15:37:08

0

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

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

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