我需要设计一个数据库表,其中大多数属性都有单位。例如:
Readings
--------
id load (kW) fuel_consumption (tonnes) - etc
1 1154 89.4
2 1199 54.2
在设计中捕获单位的推荐方法是什么?例如,我可以:
我碰巧使用的是MySQL,但我认为这是一个通用的数据库规范化问题。
答案 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”,您可以通过将所有读数转换为一致的度量单位来填充。