什么是单位和复杂单位转换的良好关系结构?

Jax*_*ian 8 schema sql-server relational-theory

我的公司在能源行业,我需要想出一个好方法来表示测量单位的转换。我已经做了一些搜索,但还没有找到一篇很好的文章,在我需要的深度上涵盖了这一点。大多数关于单位转换的信息都假设给定单元 1 有一个已知的(硬编码)转换率可以到达单元 2,这是简单的数学运算(这是我发现的最复杂的例子,但仍然无济于事)。然而,这在现实世界中并不总是正确的,对于我们必须处理的事情当然也不是这样。(抱歉写了这么长的文章——我正在尝试提供尽可能多的信息!)

棘手的示例 1: 某些转换会随时间变化,例如将 5 美元转换为欧元,反之亦然。这听起来似乎与能源无关,但它确实与能源商品市场有关(想想股票市场)。

棘手的例子 2:( 过度简化)一些天然气比其他天然气燃烧得更热。此外,天然气可以基于气体中的能量(例如Therms)或基于所述气体的体积(例如1000 立方英尺的MCF)来测量/存储,还有其他可能性(例如作为用于质谱)。汽油的一个类比是 1 加仑 87 辛烷无铅提供的能量比 1 加仑 93 辛烷无铅提供的能量少。

棘手的例子 3: 除了这些计量单位之外,我们还经常需要处理费率,例如$ per Therm€ per MCF。因此,我们需要一些方法来与这些利率和如何将它们与基本单位工作,所以如果我们需要从转换$每千卡每MCF€,我们可以和它们使用同样的发布速率转换从千卡MCF

棘手的例子 4: 以前,我非常松散地使用术语能源,有时可能是错误的。从现在开始,这种情况正在发生变化。所以最后一个曲线球是我们同时处理EnergyPower。对于电力,这意味着千瓦时千瓦尽管是雅虎问答,但这是一个相当好的解释)。数据类比:这就像比较下载的总MB数据与您的Mbps您的 ISP 为您提供的带宽。与数据一样,能源需要时间才能交付。继续进行数据类比,我们可能需要计算一段时间内消耗的平均有效带宽,因此假设在 1 分钟内下载了 60MB,“有效”速率将为 60*8/60 = 8Mbps。这里的“技巧”是,如果我们将Mbps作为一个单位本身存储,我们也需要某种方式将它直接与MB相关联,即使它也涉及时间组件。幸运的是,转换能量电源(反之亦然)是一个相当罕见的事情为我们所要做的,所以我们的解决方案应为所有其他棘手的例子进行优化,希望让这一个为好,但不处理与活力电源是一种选择。

棘手的例子 5: 这本质上是 3 + 4。我们可能既有$/KW也有$/KWh,所以费率涉及PowerEnergy

简单示例: 有些转换非常简单,而网络上的大多数信息都可以处理这些转换。1000 Wh = 1kWh 等等。与 Therms 和 Decatherms 或 kW 到 MW 等相同。我在这里不需要帮助,但请记住,我们约 70% 的转换将属于这种类型。


我对如何开始但不确定如何完成的想法:

  1. 这显然非常混乱,所以我建议我们选择一个标准的计量单位来存储每种商品和“使用类型”的所有数据。所以对于电力,我们的标准能源单位是千瓦,我们的标准功率单位是千瓦。因此,要转换为任何其他能源/功率单位,我们只需要一个转换率与我们的标准之间的转换率,而不是所有可能的组合。如果我们需要从 MW 转换为 W,我们总是可以通过转换为/从 kW 来实现。
  2. 由于转换率可能取决于特定时间,因此我们必须允许存储与测量相关的时间的能力。我怀疑我们不必担心这些转换率的变化速度超过每小时一次,我们甚至可以假设每天一次。
  3. 由于转换率可能取决于公布的值,我们必须允许存储与测量相关的值。我怀疑我们不必担心这些转换率的变化速度超过每小时一次,我们甚至可以假设每天一次。
  4. 在这一切都弄清楚之后,我预计创建一个 Web 服务,它只处理所有单位转换。我不是在寻找 SQL 来执行这些转换,我可以做一些创造性的缓存来实现它,所以我不是绝对锤击这些表,但它有时需要处理在用户访问的网站中每个页面加载约 400 个值. 我不确定这是否/如何重要。

我不知道我应该将永远不会改变的转化率与确实发生变化的转化率存储在哪个级别,以及究竟如何以一种允许我以一种易于访问的方式快速访问它们的方式来关闭它们与。

关于如何解决这个问题或什至一些可能会有所帮助的已发表阅读材料的任何想法?我正在使用 SQL Server(即将成为 SQL Azure),但这并不重要。正确表示这一点的模式是我在这里遇到的问题。如果它像英寸和厘米一样简单,那就很容易了。但变化的转化率是这里的问题。

Joe*_*own 5

您需要在设计中考虑以下几点:

1. 测量需要时间戳

确保您的所有测量结果都表明:

  • 标量值
  • 测量单位
  • 测量的日期和时间

这将允许您处理需要时间相关转换计算的测量。

2. 计量单位有属性

每个度量单位都有几个不同的属性。明显的是指示性的,比如代码,也许是描述性的名称。对于每个度量单位,还有几个关键的其他属性需要保留。(i)单位类型和 (ii)基本单位的换算系数

第一个告诉你你的度量单位是长度、重量、能量、功率、货币等。它还应该告诉你基本的度量单位是什么。您应该为每种单位类型选择一个。如果你愿意,你可以使用 kWh 之类的东西,但如果我是你,我会坚持使用基本的 SI 单位(如适用)。

第二个告诉你你的度量单位需要乘以什么才能得到它的基数。我提到这是您的 UOM 的一个属性,但实际上它需要在子表中。包含此基本转换因子的子表的业务键是 UOM、其基本单位类型和日期/时间的组合。我会在基本转换因子表上保留有效和到期日期/时间。这使您可以快速找到适用于任何特定时间点的正确费率。如果它恰好是一个不变的比率,那没关系。只需为一条记录使用最小整理生效日期和最大整理到期日期。

3. 试图驱动一切会让你发疯 最后一块拼图是确定从一种单位移动到另一种单位的计算。您可以尝试对这种计算进行表驱动,但最终,棘手的计算会使设计变得如此通用(阅读起来既复杂又缓慢),以至于不切实际。相反,创建转换计算的代码表并使用它来将一种单位类型链接到另一种单位类型。在某处的某些代码中执行实际计算。 这一段代码,你使用任何给定的转换是什么码表告诉你。 如何进行计算只是在代码中。对于各种简单的事情,您可以分别进行一种计算,例如面积需要两个长度,体积需要三个长度,而更难的事情例如工作需要能量和时间。

当您了解设计的详细信息后,您应该将其写成博客并返回此处发布链接!