sql-server – 在数据库中存储单元的最佳方法

我继承了一个包含数百个列的大型(SQLServer)数据库,这些列表示一个或另一个的数量.这些值的单位(例如“加仑”,“英寸”等)存储在扩展属性的MS_Description字段中.我想知道是否有更好的方法来存储这些信息.我认为它可以用于文档目的,但是很难根据这些数据进行可靠的单位转换计算.在这一点上,我不准备进行有创改变,但如果我有机会这样做,那么这方面的推荐最佳实践是什么?选项,在我的头顶,可能包括:

>将列名更改为包含的单位(例如,“TotalVolumeInGallons”.这会使信息更容易获得,但对我来说似乎仍然很弱.)
>添加单独的“单位”列以对应每个“金额”列(此列可以是nvarchar或它可以是单独的单位表的外键,这可以使计算单位转换更容易.另一方面,添加如此多的列可能会使我的数据库大小翻倍 – 使用非常冗余的数据.)
>在专用于单位的扩展属性中创建一个新字段. (不幸的是,我不认为这可能是Units表的外键.)
>我还有其他想法吗?

更新:在阅读了@Todd Everett的回答之后,我想到了一个可能的解决方案,所以我将继续回答我自己的问题. (见下文)

最佳答案
既然你提到了数百列我会考虑EAV design.而Joe Celko warns against this,我认为它可能适用于你的用例.听起来你的所有“金额”都是数字,所以你可以避免Joe描述的投射问题,并且需要将每个“值”都设为字符串.如果所有金额都是整数,它会更好地工作,但如果有些是十进制的,它也可以工作.给定度量单位,您可以更进一步,实现一个基于this article由David Hay创建的“通用数据模型”样式模型,并在他的书Data Model Patterns: Conventions of Thought中进行了概述.该模型还具有配置哪些“数量”适用于如果你需要那些“东西”.第162页的书中显示的另一个步骤是度量单位转换表,您可以使用该表在不同的度量单位之间进行转换.这是一个例子:

UOM Conversion              

UOM From    UOM To        Cal Step  Operator Factor Constant
Kilograms   Pounds        1         *        2.2
Celsius     Fahrenheit    1         *        1.8
Celsius     Fahrenheit    2         +               32

这表示要将Kg转换为Lb,第一步是将Kg乘以2.2.如果转换还必须包含常量值,并且能够创建多个步骤,则还有一个常量.因此,当将Celsius转换为Fahrenheit时,将Celsius乘以1.8然后再加上32.键将是UOM,UOM和Calculation Step.

这是我2美分的价值.如果你有机会重新启动当前的设计,我希望这些参考文献能给你一些很好的思考.

转载注明原文:sql-server – 在数据库中存储单元的最佳方法 - 代码日志