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放在供應商表格中,或稍後通過您使用的任何機制等待並掛鉤供應商,以獲取其他供應商的詳細信息。