数据库行长/复杂度与行数:前者是否存在理由?

时间:2013-01-10 21:21:18

标签: database database-normalization

我们有一个db表,我称之为TIMES。它传统上看起来像这样:

ID    Blah1 Blah2 Blah3  Description
1     a     b     c      Day
2     d     e     f      Night

(我添加了Blah专栏主要是为了表明表中存在更多列,但与我们尝试进行的升级没有直接关系。)

我们希望为从db获得的结果添加一些语言支持。所以我的建议是:

a)走懒惰的道路,只需添加一个新的语言专栏,给我们

ID    Blah1 Blah2 Blah3  Description  Language
1     a     b     c      Day          English
2     d     e     f      Night        English
1     a     b     c      Tag          German
2     d     e     f      Nacht        German

或者,最好是b)做一些规范化并创建一个只包含相关值的新表:

ID      Description  Language
1       Day          English
2       Night        English
1       Tag          German
2       Nacht        German

我们的数据库工作人员说,好吧,我们可以使用原始表,只需在xml中包含所有内容......这样我们就可以节省行数。

ID        Blah1 Blah2 Blah3  Language
1         a     b     c      <TimeDescriptions>
                                 <TimeDescription language='English'>
                                     Day
                                 </TimeDesciption>
                                 <TimeDescription language='German'>
                                     Tag
                                 </TimeDesciption>
                             </TimeDescriptions>        
2         d     e     f      <TimeDescriptions>
                                 <TimeDescription language='English'>
                                     Night
                                 </TimeDesciption>
                                 <TimeDescription language='German'>
                                     Nacht
                                 </TimeDesciption>
                             </TimeDescriptions> 

“节省行”?我不是一个数据库家伙,但这对我来说听起来很奇怪。当然,它会节省一些行...但是当行本身更长时,这是一个总体上的胜利吗? (很可能)除此之外,看起来它违反了我习惯的规范化规则。我也知道可以在SQL中使用XML并搜索它(虽然我没有这样做,而且我对细节非常模糊),但我只是没有看到它的胜利。

当我询问它时,他开始变得多刺,所以我退缩了,但我仍然想知道我是否遗漏了什么。显然很多细节都缺失了,但我不是在寻找详细的分析......我只是想知道这是否合理。

编辑:ARGH。你会认为我已经在这里待了很长时间才能学会正确格式化,但是我在某种程度上搞砸了最后一点......我会尝试修复它,但欢迎其他编辑。

1 个答案:

答案 0 :(得分:2)

  

当然,它会节省一些行...但这是一个整体的胜利,当   行本身更长?

可能。但这意味着页面中的行数更少,这通常意味着更多的磁盘访问和更多的磁盘I / O.那些行现在看起来太糟糕了,但是如果你支持十几种语言,那么你每行可能只需要1Kb的XML数据。粗略计算的经验法则是每页使用8Kb(有时可以调整,具体取决于你的dbms),因此每页只能获得8行。

此外,它意味着使用类似WHERE Description = 'Day'的子句查询行要困难得多。 (但是,在您的应用程序中这可能无关紧要。)此外,对于现有结构,您可以根据需要在“语言”上对表进行分区。

将新列添加到原始表似乎以引入多值依赖项,这将违反4NF。 (语言 - &gt;&gt;说明)但是,如果您可以将其建模为复合属性,则可以使该依赖关系消失。

复合属性:复合属性是一个具有内部结构的属性,dbms要么a)完全忽略,要么b)提供函数和运算符,以便用户可以操作这些部分。最常见的示例是“日期”类型的列。日期有内部结构 - 年,月,日。它们具有内部多值依赖性。但是dbms提供了函数和操作符,可以在需要时使用它们。

您的dbms可能会使用复合复合用户定义类型等单词的组合, 属性来描述此功能。

如果dbms支持用户定义的类型,则可以为区域设置特定的单词创建类型,并在表中使用该类型。

但无论如何,这不应该是意见问题。你应该能够用代理键测试5NF方法,没有代理键的5NF,复合或用户定义类型的5NF,以及一天下午或一天的XML。然后花一个下午确保你的索引和查询工作做得好,这样性能差异不仅仅是由于错误或匆忙或无知。

最后,权衡最佳表现者与维护成本。 (并使用这些新获得的技能更新您的简历。)