Database DB行长度/复杂度与行数:前者是否有理由?
我们有一个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
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方法。然后再花一个下午的时间确保索引和查询做得很好,这样性能差异就不仅仅是由于错误、匆忙或无知造成的
最后,根据维护成本权衡最佳执行者。(并用这些新学到的技能更新您的简历。)