2010-10-29 4 views
1

de ces deux modèles pour une base de données de carrefourDB design en ce qui concerne les intersections

#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 

En supposant chaque passage a seulement exactement deux routes, est-il une raison pour laquelle on utiliserait la première solution au cours de la première

EDIT: Pour la deuxième configuration, comment pourrais-je créer une vue où les résultats se présentent comme suit

crossing_id| x | y | street_nm_1 | street_nm_1 

Aussi je ne suis pas sûr de savoir comment créer une jonction avec trois routes effectuerait la vue.

Répondre

2

Je préférerais la seconde. Tout d'abord, «supposer que chaque passage ne comporte que deux routes» est plutôt risqué. En général, lors de la conception, je préfère ne pas me fier à des hypothèses qui entrent en conflit avec la réalité car tôt ou tard, votre design devra s'accommoder de «cas supplémentaires». Mais la deuxième conception est meilleure pour une autre raison ... en supposant que vous vouliez concevoir une requête qui renvoie toutes les routes qui traversent la route "X" (ce qui serait une exigence assez courante), votre première conception vous oblige à test pour la route "X" id à la fois dans street_id_1 et street_id_2 - en général, les requêtes sont plus compliquées parce que chaque fois que vous cherchez une route donnée, vous ne savez pas si elle sera répertoriée dans id_1 ou id_2. La relation "x crosses y" devrait être symétrique (sauf si vous voulez faire la distinction entre "routes principales" et "affluents", ce qui ne semble pas être le cas ici), de sorte que la deuxième conception est plus proche de l'intention.


En ce qui concerne votre question sur la vue ... Qu'en est-:

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 

Notez que cela ne donnera pas un ordre spécifique auquel la rue apparaît comme « x » et qui, comme « y ». .. peut-être vous préférez quelque chose comme:

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

Grand, je suis convaincu que la deuxième option est la meilleure solution, il me faut juste savoir comment je peux sortir les dossiers comme la première conception (voir mon édition), et comment cette vue serait affectée dans une jonction de trois routes – Moak

+0

Pour généraliser cela de 2 voies à 3 voies, vous pouvez ajouter une autre jointure pour le 3ème ID de rue, mais en faire une jointure externe (en supposant que vous avez à la fois 2 voies et 3 voies, de sorte que le La 3ème rue est "optionnelle"). Notez que si vous voulez généraliser ceci à n-ways cela devient probablement trop lourd pour le gérer comme une vue derrière N = 4 ... –

1

La deuxième solution est un peu plus flexible pour les ajouts aux traversées ou aux rues tout en gardant la relation entre eux dans son contexte approprié. C'est une distinction subtile, mais digne d'être mentionnée.