Я бы предпочел второе.
Во-первых, «предполагать, что на каждом перекрестке ровно две дороги» довольно рискованно.В целом, при проектировании я предпочитаю не полагаться на предположения, которые вступают в противоречие с реальностью, потому что рано или поздно вашему дизайну придется приспосабливаться к «дополнительным случаям».
Но второй дизайн лучше по другой причине ...Предполагая, что вы хотите создать запрос, который возвращает все дороги, которые пересекают дорогу "X" (что, я полагаю, было бы довольно распространенным требованием), ваш первый проект заставляет вас тестировать идентификатор дороги "X" как в street_id_1 , так и * 1006.* street_id_2 - в общем, запросы более запутанны, потому что всякий раз, когда вы ищете данную дорогу, вы не знаете, будет ли она указана в 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
обратите внимание, что это не даст какого-либо определенного порядка, какое уличное приложениеуши как "х" и которые как "у" ... может быть, вы предпочтете что-то вроде:
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