2010-10-29 52 views
1

這兩種設計的十字路口數據庫DB設計有關交叉

#Street 
street_id | street_nm 
#Crossing 
crossing_id | x | y | street_id_1 | street_id_2 

中VS

#Street 
street_id | street_nm 
#Crossing 
crossing_id | x | y 
#street crossing relationship 
street_id | crossing_id 

假設每個路口只有恰好兩條路,是有一個原因人會使用第一個解決方案第一次?

編輯:對於第二個設置,我怎麼可以創建一個視圖,其中結果是這樣的

crossing_id| x | y | street_nm_1 | street_nm_1 

而且我不知道如何與三個馬路創建結以免影響視圖。

回答

2

我更喜歡第二個。

首先「假設每個十字路口只有兩條路」是非常危險的。一般來說,在設計時,我寧願不要依賴於與現實衝突的假設,因爲遲早你的設計必須適應「額外案例」。

但是第二種設計更好的原因是另一個原因......假設你想設計一個查詢,返回所有穿過道路「X」的道路(我想這將是一個相當常見的要求),你的第一個設計迫使你測試road_id_1 street_id_2中的道路「X」id,一般來說,查詢更加複雜,因爲無論何時您正在查找給定道路,您都不知道它是否會在id_1或id_2中列出。

關係「x越過y」應該是對稱的(除非你想區分「主要道路」和「支流」,這似乎並不是這種情況),所以第二個設計更接近意圖。


關於你提到的有關視圖的問題...怎麼樣:

Select a.cross_id,a.x,a.y,b.street_nm,c.street_nm 
from crossing a, crossing_rel e, street b, street c 
where b.street_id=e.street_id and 
     c.street_id=e.street_id and 
     a.crossing_id=e.crossing_id and 
     b.street <> c.street 

注意,這不會給任何特定的順序哪條街顯示爲「X」,並且爲「Y」即可。 ..也許你會喜歡的東西,如:

Select a.cross_id,a.x,a.y,b.street_nm,c.street_nm 
from crossing a, crossing_rel e, street b, street c 
where b.street_id=e.street_id and 
     c.street_id=e.street_id and 
     a.crossing_id=e.crossing_id and 
     b.street_nm < c.street_nm 
+0

大,我相信,第二個方案是最好的解決辦法,我只需要知道我可以輸出記錄,如第一個設計(見我的編輯)以及這個觀點如何受到影響三條路的交界處 – Moak 2010-10-29 08:08:37

+0

爲了將這種路由從2路推廣到3路,您可以爲第3個街道id添加另一個連接,但將其設爲外部連接(假設您有2路和3路),所以第三街是「可選」)。請注意,如果您想將其推廣到n種方式,則可能過於麻煩,無法將其作爲N = 4背後的視圖進行管理。 – 2010-10-29 08:15:44

1

第二種解決方案更靈活一點,可以添加到交叉口或街道,同時保持它們之間的關係在適當的上下文中。這是一個微妙的區別,但值得一提。