2010-10-29 4 views
1

Из этих двух конструкций для перекрестка базы данныхDB Design относительно перекрестков

#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 

Предполагая, что каждый перекресток имеет только ровно две дорогу, есть причина, почему один будет использовать первое решение над первым?

EDIT: Для второй установки, как я мог бы создать представление, где результаты выглядят как этот

crossing_id| x | y | street_nm_1 | street_nm_1 

Кроме того, я не знаю, как создать соединение с тремя дорогами будет влиять на вид.

ответ

2

Я предпочел бы второй.

Прежде всего, «предполагая, что каждое пересечение имеет ровно две дороги», весьма рискованно. В общем, при проектировании я предпочитаю не полагаться на предположения, которые столкнулись с реальностью, потому что рано или поздно ваш дизайн придется размещать для «лишних случаев».

Но второй дизайн лучше по другой причине ... если вы хотите спроектировать запрос, который возвращает все дороги, пересекающие дорогу «X» (что, я полагаю, было бы довольно распространенным требованием), ваш первый проект заставляет вас тест для дорожного «X» id как в street_id_1 , так и 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 
+0

Великий, я убежден, что второй вариант является лучшим решением, мне просто нужно знать, как я могу выводить записи, как первый дизайн (см мой выбор), и как это мнение будет затронуто в соединение трех дорог – Moak

+0

Чтобы обобщить это с 2-way на 3-way, вы можете добавить еще одно соединение для третьего идентификатора улицы, но сделайте его внешним соединением (при условии, что у вас есть как 2 пути, так и 3 пути, поэтому 3-я улица является «факультативной»). Обратите внимание: если вы хотите обобщить это на n-way, это становится слишком громоздким, чтобы управлять им как представление за N = 4 ... –

1

Второе решение является более гибким для дополнений к перекресткам или улицам, сохраняя при этом взаимосвязь между ними в надлежащем контексте. Это тонкое различие, но стоит упомянуть.