2010-04-23 4 views
0

J'écris une application qui achemine des trains modèles, qui sont stockés dans la table de base de données [TrainStop] comme suit:requête pour travailler sur des destinations possibles sur un ensemble de routes avec SQL Server 2008

TrainServiceId StationCode StopIndex IsEnabled

Ainsi, un train donné suit un itinéraire et se compose de plusieurs lignes avec le StopIndex indiquant la commande. Le problème que j'essaie de résoudre est de dire à quelles stations un utilisateur peut accéder à partir d'une station de départ donnée en fonction des services de train disponibles. Ce serait relativement simple MAIS il est également possible de désactiver les arrêts, ce qui signifie qu'un utilisateur ne peut se rendre à aucune destination après cet arrêt pour ce service de train. Il est également possible que plusieurs trains sur des voies différentes peuvent partager des stations, par exemple:

service ferroviaire 1: A, B, C, D, E

service de train 2: P, Q, B, C, D, R

Ainsi, si un utilisateur est en B, il peut aller en C, D, E et R, mais si la station D est désactivée sur l'un ou l'autre service, il peut uniquement accéder à C. Si la station E est désactivée sur le service 1, l'utilisateur peut accéder à C, D et R.

La résolution de ce problème est assez simple en C# mais je me demande si elle peut être résolue avec élégance et efficacité dans SQL? J'ai du mal à trouver un moyen, pour chaque route, d'exclure les stations après une rangée qui n'est pas activée.

+0

Pouvez-vous donner des exemples de données d'entrée et de sortie? –

Répondre

1

Je pense que je pourrais mettre en place de cette façon. Trois tables:

ROUTE
Liste des itinéraires

STATION
Liste des stations

ROUTEPATH (ou plan de route?)
Many-to-many table entre la route et la station, y compris le StopIndex attribut

Si une station est activée ou désactivée est à la fois un attribut d'une station individuelle (la station est fermée) ET un attribut de la route (station avant "thi") s "la station est fermée, donc" ceci "est également fermé). Cela signifie que IsEnabled doit apparaître dans les tables STATION et ROUTEPATH.

Lorsqu'une station doit être désactivée:

  • Drapeau comme désactivé dans la station
  • Drapeau comme désactivé dans ROUTEPATH
  • Pour chaque itinéraire contenant cette station, drapeau toutes les stations avec StopIndex supérieure cette station est désactivée (ces deux dernières peuvent être exécutées comme une requête de mise à jour)

Lorsqu'une station doit être activée, inversez le processus.

Il y aura bien sûr des problèmes lorsque plus d'une station sera désactivée - ou plutôt, lorsque certaines stations désactivées seront réactivées.Je pense qu'il serait préférable de faire l'attribut de ROUTEPATH « IsDisabled », et en faire un entier:

  • zéro signifie pas désactivé
  • signifie non-zéro désactivé
  • incrémentons pour chaque « disabled la station «action
  • décrémentez pour chaque « station activée » l'action

un système comme celui-ci devrait se prêter à des requêtes relativement simples.

+0

Désolé, cela aurait dû être clair, il s'agit en fait de trains sur les routes et c'est le train qui ne peut pas s'arrêter à la gare, donc il n'est pas possible de marquer la station en elle-même comme non activée. –

+0

Mon point d'origine (si non déclaré ouvertement) était que "IsEnabled" signifiait différentes choses pour différentes entités, et globalement il semblait préférable de calculer et d'appliquer activé/désactivé à toutes les entrées affectées (pas seulement celui) au moment où la table était mis à jour avec les nouvelles informations. Je crois que cette logique devrait toujours être vraie. –

Questions connexes