0

我有一个旨在存储赛马时间的数据库。目前,我有一张Race桌子和一张RaceTimes桌子。每个都有 5 次分段时间和 5 次分段时间。该RaceTime表还包括一个Race外键。

例如:

RaceTime桌子:

    RaceTime_id (primary key)
    Race_id  (foreign key)
    TimeValue  (time stored in 100th of seconds)
    PointOfTime (i.e. 1/4 mile, 1/2 mile, etc.)
    Which (where which is an integer between 1 and 5)

鉴于每场比赛有 5 次和 5 次分裂,这种方法RaceTime为每场比赛产生 10 条记录。或者,我可以创建一个数据库结构,其中包括:Fraction1、Fraction2....Fraction5 和 Split1、Split2...Split5。Race在这种方法下,记录和RaceTime记录之间会有一对一的匹配,并且RaceTime表的行数会少得多。

我的阅读和研究使我相信第一种方法更可取。我相信这个数据更加规范化。由于桌子大小的不同,我想我有些停顿,但也许它只是长桌或宽桌之间的权衡。

话虽如此,我希望能得到那些更精通这些事情的人的意见,我只是一个喜欢玩马的会计。感谢您的输入。

4

2 回答 2

3

你是对的 - 第一种方法更好。第二种方法的缺点:

  1. 添加新分数或拆分的困难(有时规则会更改,或出现异国情调的比赛)
  2. 当您需要按分数或拆分选择数据时出现问题。您需要在 5 个分数和 5 个拆分列上创建索引。这会大大降低性能。
  3. 从此类表中选择数据的代码应显式处理这些附加列。您需要对字段 Fraction1、...、Fraction5 和 Split1、...、Split5 进行硬编码,而不是使用循环。由于重复的代码片段,可能会出现一些错误。

然而,第二种方法具有更好的性能,但现代应用程序使用缓存来“记住”非规范化数据。所以这个优势是微不足道的。

于 2015-09-12T09:37:15.187 回答
1

这在很大程度上取决于您在表上执行的查询类型。如果您按照代码示例对表格进行规范化,您最终将不得不进行JOIN一些额外的处理来检索给定比赛的数据。如果您的数据库索引良好,这应该不会太慢,但这是一些额外的工作。

但是,如果您确信任何给定比赛都会有五个(不多也不少)分裂/分数,将其非规范化(Split1...Split5方式)将使您的表现稍好,但如果您不得不这样做,那将是一个巨大的痛苦(例如)添加第六个拆分。

你的来电; 只有你才能知道什么最适合你的应用。

于 2015-09-12T09:27:09.367 回答