1

希望我的描述比标题好一点,但基本上我对新应用程序模式的一部分有问题,我被困在表结构中最易于管理和优雅的解决方案上。

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

航空公司 (id, name, ...)
酒店 (id, name, ...)
供应商 (id, name, ...)
事件 (id, name, ...)
eventComponent (id,name) {例如餐饮, 房间租用, 音频/视频...}
eventFlight (id, eventid, airportid, ...)
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 CONSTRAINT CHECK (hotelid IS NOT NULL OR supplierid IS NOT NULL),
FOREIGN KEY (hotelid) REFERENCES hotel(id),
FOREIGN KEY (supplierid) REFERENCES supplier(id)
);

然后为了检索这些数据,只需使用两个表的外连接来确定哪个表是链接的。

选择 e.id 作为 eventid,coalesce(h.name,s.name) 作为供应商
from eventSupplier es
left outer join
supplier s on s.id = es.supplierid
left outer join
hotel h on h.id = es.hotelid
where h .id 不为空或 s.id 不为空

我的其他选择是在 eventSupplier 表中有一个外键,而另一个字段用于“类型”,这似乎是一个更难从中检索数据的解决方案,尽管如果我想在没有进行架构更改。或者直接将hotelid 存储在Supplier 表中,并仅将一些供应商声明为“酒店”,尽管当时存在我不想要的冗余数据。

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

干杯菲尔

4

2 回答 2

1

如何一个接一个地处理事件并使用 anEventGroup将它们组合在一起? 替代文字

编辑

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

替代文字

于 2010-08-18T11:40:30.640 回答
0

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

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

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

于 2010-09-06T14:43:15.737 回答