如何在数据库设计中建模属性单元?

时间:2012-10-25 11:19:19

标签: mysql database database-design normalization database-normalization

我需要设计一个数据库表,其中大多数属性都有单位。例如:

Readings
--------

id   load (kW)   fuel_consumption (tonnes) - etc
1    1154        89.4
2    1199        54.2

在设计中捕获单位的推荐方法是什么?例如,我可以:

  • 在属性名称中存储单位,例如load_kW和fuel_consumption_tonnes
  • 将单位存储在单独的表格中,例如每个值都成为另一个表的外键,其中包含值和单位的列。
  • 在数据库外部存储:,例如在业务逻辑或文档中
  • 还有其他人吗?

我碰巧使用的是MySQL,但我认为这是一个通用的数据库规范化问题。

2 个答案:

答案 0 :(得分:2)

最终取决于您对数量的意图或需要。

如果(在不太可能的情况下)你将要记录的值是为了后来的反流,那么你用单位做什么并不重要,因为标量值对你的模型没有语义意义。

更有可能的是,系统中的标量对您的系统有一定的重要性。这可能是因为您正在对它们执行计算。在这种情况下,您的单位非常重要。

您需要自己回答的下一个问题是单位是否始终保持一致,不得更改。在大多数情况下,我会说这是一个冒险的结论。它可能是您通过系统强加的业务规则,但业务规则有一种令人厌恶的改变习惯。

出于这个原因,我建议存储一个度量单位,每个标量代表一个实际的测量值。以这种方式显式占用一些磁盘空间,但它为您提供了清晰度和灵活性。

我过去做过的事情是将度量单位模型扩展为包括UOM类型,如长度,温度,音量,时间等。保持将每个UOM映射到UOM类型的表也允许您存储转换因子。这样一来,如果有人以BHP和磅读数来找你,你会知道如何处理它,以及如何将它与典型的千瓦和吨的数据进行比较。

答案 1 :(得分:1)

有趣的问题......

有两条明显的路线:

id   load_kW     fuel_consumption_tonnes
--------------------------------------------------
1    1154        89.4
2    1199        54.2

这对人类来说很容易阅读,而且相当合乎逻辑。但是,如果某些读数为“千克”,其他读数为“吨”,则必须将这些读数转换为“读数”表;这个过程必须是“无损”的,并且是幂等的。例如,“89403公斤”的读数不是“89.4吨”,尽管为方便起见,企业可能会选择从公斤到公吨。通常会发生一些反直觉的四舍五入的事情......

如果是这种情况,您可以更改架构:

id      load load_unit    fuel_consumption fuel_consumption_unit
--------------------------------------------------
1    1154  kW          89403              kg
2    1199  kW          54.2               t

如果您需要,可以使用“单位”表:

unit_id    unit_name
--------------------
kg         kilogramme
t          Tonne

但是,此模型对人为失败是开放的 - 在不修改“加载”列的情况下更改“load_unit”列很容易,从而破坏数据。为了避免这种情况,您无法对数据模型做任何事情。它还使常见查询相当棘手:想象一下尝试以一致的度量单位检索“加载”的总和。

我建议在这种情况下,您有两个表:“raw_readings”,上面格式的原始数据和“normalized_readings”,您可以通过将所有读数转换为一致的度量单位来填充。