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. 我在一张表中转换了 3000 个条目,从数据库中检索所有数据需要 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 支持它,那样)?检索的 500 毫秒和转换的 4 分钟听起来都长得离谱;每个跑步者有多少行?你有必要的索引吗?并且对相关框架知之甚少,但我怀疑它runner.RunnerTimes.Select(...)所做的工作超出了应有的范围。

于 2013-01-04T20:48:21.243 回答
0

如果代码首先存在,您可以考虑将代码优先方法与实体框架一起使用。

实体框架代码优先:让我们尝试一下

于 2013-01-04T19:56:29.950 回答