我更喜歡第二個。
首先「假設每個十字路口只有兩條路」是非常危險的。一般來說,在設計時,我寧願不要依賴於與現實衝突的假設,因爲遲早你的設計必須適應「額外案例」。
但是第二種設計更好的原因是另一個原因......假設你想設計一個查詢,返回所有穿過道路「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
大,我相信,第二個方案是最好的解決辦法,我只需要知道我可以輸出記錄,如第一個設計(見我的編輯)以及這個觀點如何受到影響三條路的交界處 – Moak 2010-10-29 08:08:37
爲了將這種路由從2路推廣到3路,您可以爲第3個街道id添加另一個連接,但將其設爲外部連接(假設您有2路和3路),所以第三街是「可選」)。請注意,如果您想將其推廣到n種方式,則可能過於麻煩,無法將其作爲N = 4背後的視圖進行管理。 – 2010-10-29 08:15:44