2010-04-28 5 views
3

J'ai un problème de conception de base de données intéressant que j'ai formulé en voyageant par autobus, revenant de chez moi.Question sur la conception de la base de données

Concevoir une base de données normalisée pour un système de billetterie de bus (et non un système de réservation). Lors de chaque voyage, le conducteur de l'autobus remettra des billets à ses passagers après leur avoir retiré leur billet. Les passagers voyagent d'un lieu source à divers lieux de destination.

Le système doit être en mesure de donner un rapport des lieux pour lesquels le nombre de passagers était plus 2.

Supposons que les arrêts du bus sont L1, L2, L3 et L4 Supposons voyages P1 passager de L1 à L4. P2 se déplace de L2 à L4. P3 se déplace de L3 à L4.

Le rapport devrait indiquer seulement (L3-L4) pour lequel il a plus de 2 voyageurs.

Pouvez-vous s'il vous plaît me aider à résoudre les problèmes suivants

1) La conception d'une base de données normalisée

2) Ecrire une requête pour le rapport

3) Est-il un site qui donne ce genre des questions et des réponses intéressantes de conception de base de données?

+0

> 3) Y at-il un site qui donne ce genre de questions de conception de base de données intéressantes ... Je suppose que la réponse à cette question est "votre classe". – tpdi

+1

Cela ressemble à une tâche pour un devoir ou un devoir d'entrevue. "concevoir une base de données normalisée", "écrire une requête", "le rapport devrait lister" sont tous des critères pour quelque chose de cette nature et pas quelque chose que j'écrirais généralement si je demandais de l'aide pour une idée de design. la tête pour le plaisir. –

+0

Sonne comme une mission pour moi, pas si difficile que je vous suggère d'aller faire un tour et de poster vos trucs si vous avez besoin d'aide sur des points spécifiques ;-) –

Répondre

1

DataBase Conception:

Location Table 

- LocationID (p) 
- LocationName 

TravelTable 

- TravelID (p) 
- PassengerID 
- LocationFrom (F) - (Location - LocationID) 
- LocationTo (F) - (Location - LocationID) 

PassengerTable 

- PassengerID (p) 
- PassengerName 

Est-ce que vous revenir bientôt avec requête aussi

forme du site où vous obtenez la réponse appropriée

http://blog.sqlauthority.com/

http://www.sqlservercentral.com/

+0

Merci. Un point clé. Comment décidez-vous de l'ordre des lieux? comme L3 est après L2? – Lijo

+0

Parce qu'un bus se déplace en ligne droite et l3 vient après l2. A moins que vous ne reveniez dans ce cas, l3 vient avant l2. Ou vous vous téléportez, auquel cas l1 vient après l3 et l2 vient avant l4. –

+0

Mon point ici est, nous ne devrions pas utiliser l'ordre des enregistrements dans la table de localisation comme l'ordre de l'emplacement réel. – Lijo

0

La clé table w ould être:

voyage (trip_id, passenger_id, start_location_id, end_location_id)

Vous pourriez avoir une table de localisation des informations sur les arrêts.

Ensuite, la requête serait tout simplement

select start_location_id, end_location_id, count(*) 
from trip 
group by start_location_id, end_location_id 
having count(*)>=2 

Modifier

par commentaire ci-dessous, peut-être que je suis mal compris l'exigence. Essayez-vous de trouver des ADPIC qui ont plus de 2 passagers, ou des LOCATIONS qui ont plus de 2 passagers, ou quoi? Autrement dit, si nous avons des voyages (Al, L1, L2), (Betty, L1, L2), (Carl, L1, L3), (Donna, L2, L4), si la sortie soit:

L1, L2, 2 

(et c'est tout)?

Ou devrait-il être

L1, 3 
L2, 3 

Je crois que ma requête serait au-dessus de donner le premier résultat.Si vous cherchez le deuxième résultat, ce serait:

select location, sum(visits) 
from 
(
select start_location_id as location, count(*) as visits 
from trip 
union 
select end_location_id as location, count(*) as visits 
from trip 
) 
group by location 
having sum(visits)>=2 
order by location 

Comme vous ajoutez ensemble compte pour deux colonnes différentes, je ne vois aucun moyen d'éviter d'utiliser l'union et une requête interne.

On peut dire que, d'un autre schéma ferait cette requête beaucoup plus facile, à savoir, au lieu de voyage ont trip_stop:

trip_stop (passenger_id, location_id, stop_number)

où stop_number est, par exemple, 1 pour commencer l'emplacement et 2 pour l'emplacement final. Maintenant que j'y pense, c'est vraiment mieux, car il élimine deux champs qui représentent la même idée, tout en facilitant l'expansion pour avoir des déplacements avec des arrêts multiples.

Ensuite, la requête devient simplement

select location_id, count(*) 
from trip_stop 
group by location_id 
having count(*)>=2 
order by location_id 
+0

Je ne pense pas que cela répondra à l'exigence. Lorsque vous regroupez en utilisant l'emplacement de départ et l'emplacement de fin, chacun d'eux fera un groupe séparé. Aucun enregistrement ne sera sélectionné. (TripID PassID StartLoc EndLoc) (1 P1 L1 L4) (1 P2 L2 L4) (1 P3 L3 L4) – Lijo

0

Cela me rappelle l'analyse de la classe de liveness compilateur. L'objectif est de déterminer quelles variables sont utilisées en même temps, afin que l'allocation des registres soit plus efficace. Les autres réponses couvrent assez bien la partie base de données. Pour l'algorithme sur lequel x (voyage, emplacement) ont plusieurs passagers, lisez l'analyse de vivacité et le balayage linéaire.

Questions connexes