在SQL Server表中存储规范化数据有哪些优缺点

时间:2015-09-12 09:18:37

标签: sql-server database-normalization entity-relationship-model

我有一个专门用于存储赛马时间的数据库。目前,我有一个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)

鉴于每场比赛有五次和五次分组,这种方法为每场比赛产生10 RaceTime个记录。或者,我可以创建一个数据库结构,包括:Fraction1,Fraction2 .... Fraction5和Split1,Split2 ...... Split5。在这种方法下,Race记录与RaceTime记录之间将存在1对1匹配,而RaceTime表将具有更少的行。

我的阅读和研究使我相信第一种方法更可取。我相信这些数据更加规范化。我想我有一些暂停因为表格大小不同,但也许只是在长桌或宽桌之间进行权衡。

那就是说,我希望得到那些更精通这些事情的人的意见,我只是一个喜欢玩马的会计师。感谢您的投入。

2 个答案:

答案 0 :(得分:3)

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

  1. 添加新分数或分裂的困难(某些时候规则被更改,或出现异国情调的比赛)
  2. 需要按分数或拆分选择数据时出现的问题。您需要在5个分数和5个分割列上创建索引。这会大大降低性能。
  3. 从此类表中选择数据的代码应明确处理此附加列。您需要硬编码字段Fraction1,...,Fraction5和Split1,...,Split5,而不是使用循环。由于重复的代码片段,可能会出现一些错误。
  4. 然而,第二种方法具有更好的性能,但现代应用程序使用缓存来“记住”非规范化数据。所以这个优势是微不足道的。

答案 1 :(得分:1)

这在很大程度上取决于您在桌面上执行的查询类型。如果您在代码示例指示时对表进行规范化,则最终必须执行JOIN和一些额外处理以检索给定种族的数据。如果您的数据库索引良好,这不应该太慢,但这是一些额外的工作。

但是,如果您确信将会有五个,不多也不少,对任何给定的种族进行分割/分数,对其进行非规范化(Split1...Split5方式)将使您获得稍微更好的性能,但是如果你不得不(比如说)增加第六次分裂,那就是巨大的痛苦。

你的电话;只有你能知道什么是最适合你的应用程序。