БД Дизайн относительно пересечений - PullRequest
1 голос
/ 29 октября 2010

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

#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 ]

2 голосов
/ 29 октября 2010

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

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

Но второй дизайн лучше по другой причине ...Предполагая, что вы хотите создать запрос, который возвращает все дороги, которые пересекают дорогу "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 
1 голос
/ 29 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...