c#中的数据库和程序组织

时间:2013-01-04 19:38:19

标签: c# sql database linq relational

首先让我给你一些背景信息。

我有一些看起来像这样的数据:

  • Runner1 | Date1 |时间1 | Laps1 |时间2 | Laps2 | ...... |时间50 | Laps50
  • Runner1 | Date2 |时间1 | Laps1 |时间2 | Laps2
  • Runner1 | Date3 |时间1 | Laps1 | ...... |时间32 | Laps 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结构“转换”为现有的类和函数?
  3. 一些额外数据:

    1. 我上面显示的结构是假的,但类似于我的实际结构
    2. 我在一个表中转换了3千个条目,从数据库中检索所有数据需要500毫秒,但需要大约4分钟才能转换为现有的类结构。
    3. 谢谢!

2 个答案:

答案 0 :(得分:0)

如果代码首先存在,您可以考虑将Code First方法与Entity Framework一起使用。

Entity Framework Code First: Let's Try It

答案 1 :(得分: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支持它,那么)?检索的500毫秒和转换的4分钟听起来可笑得多;每个跑步者有多少行?你有必要的指数吗?并且对相关框架知之甚少,但我怀疑runner.RunnerTimes.Select(...)正在做的工作比它应该做的更多。