1

まず、前後関係を説明します。

次のようなデータがあります。

  • ランナー1 | 日付1 | 時間 1 | ラップ1 | 時間 2 | ラップ2 | ... | タイム50 | ラップ50
  • ランナー1 | 日付 2 | 時間 1 | ラップ1 | 時間 2 | ラップ2
  • ランナー1 | 日付3 | 時間 1 | ラップ1 | ... | 時間32 | 32周

意味: ランナーの合計時間と周回数は、日付ごとに異なります。

SQL データベースの作成方法のモックアップを次に示します。

(ASCII アートで申し訳ありませんが、それは私の最初の質問です)

|Runner  |     |RunnerTimes   |    |Time    |
|RunnerID|-----|RunnerTimesID |----|TimeID  |
               |RunnerID      |    |Laps    |
               |TimeID        |    |Duration|
               |Date          |

私の問題は、データベースの前に作成されたコードがあることです:

public class iRunner
{
    public int[] laps;
    public TimeSpan[] duration;
}
public static class RunnerFunctions
{
    public static double AverageLaps(iRunner runner)
    {
        return runner.laps.Average();
    }
}

したがって、次を使用してすべてのランナー データを取得できます。

Runner runner = dbContext.Runner.Where(item=>item.RunnerID == 1);

次に、クラス形式に「変換」する必要があります。

iRunner r = new iRunner();
r.Laps =  runner.RunnerTimes.Select(a=>a.Laps).toArray();
r.Duration = runner.RunnerTimes.Select(a=>a.Duration).toArray();

そして、既存のメソッドを実際に呼び出すことができます。

Double average = RunnerFunctions.Average(runner);

背景がわかったところで、私の質問は次のとおりです。

  1. それは SQL でデータをモデル化する正しい方法ですか?
  2. SQL 構造を既存のクラスや関数に「変換」するより良い方法はありますか?

いくつかの追加データ:

  1. 上に示した構造は偽物ですが、実際の構造に似ています
  2. 1 つのテーブルで 3,000 エントリを変換しています。データベースからすべてのデータを取得するには 500 ミリ秒かかりますが、既存のクラス構造に変換するには約 4 分かかります。

ありがとうございました!

4

2 に答える 2

0

あなたのスキーマ設計は私が使用するものに近いです:

Runner 
========
id  -- autoincrement

Run
==========
runnerId  -- fk to Runner.id
startedAt  -- timestamp
laps  -- int count
duration  -- int duration in milliseconds/seconds 
          -- (unless your RDBMS has a 'duration' type).

RunnerTimesより多くの「現実世界」の情報を提供することにならない限り、現時点ではそれほど有用ではないようです。
特に実行回数が非常に変動する場合は、これをお勧めします。

個人的には、既存のコードは少し疑わしいと思います(本当にそのような公開データメンバーがありますか?)。また、なぜ平均的なデータベース側を実行できないのですか(直接、またはLinq-to-SQLがサポートしている場合はそのように)?そして、リトリーブの500msとコンバートサウンドの4分の両方が途方もなく長いです。ランナーごとにいくつの行がありますか?必要な指標はありますか?また、関連するフレームワークについては十分に理解していませんが、それが本来runner.RunnerTimes.Select(...)よりも多くの作業を行っているのではないかと思います。

于 2013-01-04T20:48:21.243 に答える
0

コードが最初に存在する場合は、Entity Framework で Code First アプローチを使用することを検討してください。

Entity Framework Code First: やってみよう

于 2013-01-04T19:56:29.950 に答える