希望我的描述比标题好一点,但基本上我对新应用程序模式的一部分有问题,我被困在表结构中最易于管理和优雅的解决方案上。
仅显示相关字段的裸骨表结构如下:
航空公司 (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 表中,并仅将一些供应商声明为“酒店”,尽管当时存在我不想要的冗余数据。
对此的任何想法将不胜感激!
干杯菲尔