Database DB行长度/复杂度与行数:前者是否有理由?

Database DB行长度/复杂度与行数:前者是否有理由?,database,database-normalization,Database,Database Normalization,我们有一个db表,我会多次调用它。传统上看起来是这样的: ID Blah1 Blah2 Blah3 Description 1 a b c Day 2 d e f Night (我添加了Blah列主要是为了表明表中还有更多的列存在,但与我们尝试进行的升级没有直接关系。) 我们希望为从db获得的结果添加一些语言支持。因此,我的建议是: a) 走懒散的路,为语言添加一个新的专栏,给我们 ID Blah1 Blah2

我们有一个db表,我会多次调用它。传统上看起来是这样的:

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
我们的DB负责人说,好吧,我们可以只使用原始表,将所有内容都包含在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> 
ID Blah1 Blah2 Blah3语言
1 a b c
白天
标签
二维e-f
夜
纳希特
“按行保存”?我不是一个真正的db人,但这听起来很奇怪。当然,它会保存一些行…但是当行本身更长时,这是一个整体胜利吗?(很可能)除此之外,它似乎打破了我习惯的规范化规则。我还知道,可以在SQL中使用XML并搜索它(虽然我还没有这样做,对细节也不太清楚),但我看不出这有什么好处

当我问起这件事时,他开始生气了,所以我退后了,但我还是想知道我是否遗漏了什么。很明显,很多细节都不见了,但我不是在寻找详细的分析……我只是想知道这是否合理

编辑:啊。你可能会认为我在这里呆了足够长的时间,已经学会了正确格式化,但我不知怎么搞砸了最后一点……我会尝试修复它,但欢迎其他编辑

当然,它会保存一些行…但是当 行本身长得多

可能吧。但这意味着一个页面中可以容纳的行更少,这通常意味着更多的磁盘访问和更多的磁盘I/O。这些行现在看起来不太糟糕,但如果您支持十几种语言,那么仅XML数据一行就可能有1Kb。我粗略计算的经验法则是每页使用8Kb(有时可以根据dbms进行调整),因此每页只能得到8行

此外,这意味着使用类似
的子句查询行,其中Description='Day'
要困难得多。(不过,这在应用程序中可能并不重要。)此外,使用现有结构,如果需要,可以按“语言”对表进行分区

向原始表中添加新列似乎会引入多值依赖关系,这将违反4NF。(语言->>Description)但如果可以将其建模为复合属性,则可以消除这种依赖关系

复合属性:复合属性是一种具有内部结构的属性,dbms可以A)完全忽略该属性,或者b)提供函数和运算符,以便用户可以操作这些片段。最常见的示例是类型为“date”的列。日期有内部结构——年、月、日。它们具有内部多值依赖关系。但是dbms提供了函数和操作符,可以在您需要时获取这些片段

您的dbms可能会使用复合词、复合词、用户定义词、类型、列和属性的一些组合来描述此功能

如果dbms支持用户定义的类型,则可以为特定于语言环境的单词创建类型,并在表中使用该类型

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

最后,根据维护成本权衡最佳执行者。(并用这些新学到的技能更新您的简历。)