2009-05-27 13 views
4

Uniでの2年生のデータベースデザインクラス以降、しばらくお待ちください。暫定的には何もデザインをしていないので、現時点では私のスキルは最高のものです。私は鉄道の時刻表システムに関わる個人的なプロジェクトに取り組んで開始し、このような何かに似ているテーブルデザインで立ち往生しているように見えるしている -トランスポートタイムテーブルシステムのデータベース設計

StationTbl 
------------ 
    StnName 
    StnCity 
    StnCode - {Primary Key} 

TrainTbl 
--------- 
    TrnName 
    TrnNumber - {Primary Key} 
    SourceStn 
    DestStn 
    DaysofWeek 

TrainHopTbl 
-------------- 
    TrnNumber - {Primary Key} 
    StationCode - {Primary Key} 
    ArrTime 
    DepTime 
    HopIndex 

ほとんどのフィールドは、時間フィールドとでHopIndexを除いてalphanumbericですTrainHopTbl。あなたが見ることができるように、予備的な設計は非常に原油であり、完成までは遠くない。

列車の名前/番号に基づいて、または送信元と宛先のステーションを指定して、列車を見つけることができます。最初のクエリは簡単に処理できますが、ユーザーがsrc/destペアを指定してサーバーがそのルート上で実行される列車の一覧を返す2番目の検索のクエリを作成する際に問題が発生しています。この情報は、のようなので、特定の列車のためのホップのリストが含まれているTrainHopTblから抽出されます -

TrainHopTbl 
-------------- 
Num StnCode ArrTime DepTime HopIndex 
121 WDC  0900  0910  1 
121 BAL  1005  1010  2 
121 NYC  1145  -   3 

ユーザーはSRC/DESTのペアとしてWDC/NYCを入力した場合、クエリは、列車番号を返す必要がありますこれは有効なルートであるためです。

データベース設計に関する参考資料は、参考になるはずです。ヘックは、この時点で実行可能なクエリや全体の再設計が役立つだろう、私は逃げにくいと思っていたが、これは私の進歩を完全に失速させた。

+0

+1明確に記載された質問、例、および使用例が記載されています。 –

答えて

3

私はあなたのTrainTblからあなたのSourceStnとDestStnを取るでしょう - それは不必要な混乱です。

とにかく、あなたがして探しているものを手に入れることができます。

select 
    src.TrnNumber, 
    srcSt.StnName as SourceStation, 
    srcSt.StnCity as SourceCity, 
    src.DepTime, 
    destSt.StnName as DestinationStation, 
    destSt.StnCity as DestinationCity, 
    dest.ArrTime, 
    (abs(dest.HopIndex - src.HopIndex)) as Stops 
from 
    TrainHopTbl src 
    inner join TrainHopTbl dest on 
     src.TrnNumber = dest.TrnNumber 
    inner join StationTbl srcSt on 
     src.StnCode = srcSt.StationCode 
    inner join StationTbl destSt on 
     dest.StnCode = destSt.StationCode 
where 
    src.StnCode = 'WDC' 
    and dest.StnCode = 'NYC' 
    and src.HopIndex < dest.HopIndex 
order by 
    Stops asc, 
    DepTime asc 

編集:私はここに口座振替に入れていないし。あなたの質問はまっすぐなルート列車に言及しました。あなたが移転を希望するかどうかを教えてください。

+0

+1素晴らしい解決策。ルートを細く絞ってキャッシュします。返された列車が正しいdirに入るようにします。 –

+0

ORDER BY hopindex /旅行時間の他の表示を提案してもよいですか? –

+0

それは良い追加です。 ArrTimeとDepTimeを時間として保存した場合は、datediffを使用して合計移動時間を調べることができます。当分の間、私は停止時間と出発時間で注文します。 – Eric

-2

データベースでハードグラフの問題を解決しようとしているようです。この中で、

"WDC, BAL, NYC" 

は、次に、あなたはちょうどあなたが探している2つのサブストリングが含まれている列車を見つける必要があり

文字列形式でストップのリストを格納列車のテーブルにフィールドを追加する方がはるかに簡単であるかもしれませんケース「WDC」および「NYC」。これにより、SQL以外のコードで結果として生じる列車を考慮できるように、検索が大幅に絞り込まれます。あなたが、その後どうなる何をすべきか、私が今行うには喜んでより多くの研究を行うことなく

は、「WDC」が含まれているところから

SELECTであり、「NYC」が含まれてい

私は知りません含まれている最善の方法...コメント誰ですか?

+1

列車が20駅ある場合はどうなりますか?ボストンの通勤電車についても考えてください。それはかなり効率が悪いですね。なぜ、SQLで文字列を解析するのではなく、set transactionを使用するのですか?それが同じTrain#でHopIndexが正しい順序である限り、人生はpeachy keen(アカウント転送を考慮しない)でなければなりません。 – Eric

+0

エリック、申し訳ありません - 私はあなたを「セット取引」で亡くしました。詳しく教える? – aks

2

私はまだこれを考えていないので、この応答は途方もないかもしれません。

私はTrainHopTblがネットワーク内のノードを記録していると思います。ネットワーク内のエッジを記録する方が便利です。エッジには列車番号、出発駅、出発時刻、到着駅、到着時刻があります。そして、あなたのようなホップインデックスかもしれません。

したがって、

民:121、Hopindex:1、DepStnCode:WDC、DepTime:910、ArrStnCode:BAL、ArrTime:1005

ボルチモアワシントンからの "ホップ" を記述出来、エッジホップのネットワークで

(また、私は「足」ホップを呼び出し、それだけの命名の選択でしょう。)

をホップが2つのステーションを結ぶ持つことにより、それが可能リンクアップにからあなたを取得するホップのシリーズになります1回の旅行で1つの場所から別の場所へ。到着時刻が次のホップの出発時刻の少し前であれば、一部の駅で列車を変更することもできます。

この点の欠点は、ステーションコードにもう少し冗長性があることです。この冗長性が有害であるかどうかはわかりません。

+0

"エッジ"アプローチは良いとは言えますが、それはEricの提案されたクエリの完全な再設計を意味します。駅コードの冗長性に関しては、私は他の方法はないと思います。ほとんどのコードは3〜4文字の長さですから、サイズの次元に大きな影響を与えません。 – aks