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

mtm*_*ald 5 mysql database database-design normalization database-normalization

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

Readings
--------

id   load (kW)   fuel_consumption (tonnes) - etc
1    1154        89.4
2    1199        54.2
Run Code Online (Sandbox Code Playgroud)

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

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

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

Nev*_*uyt 2

有趣的问题...

有两条明显的路线:

id   load_kW     fuel_consumption_tonnes
--------------------------------------------------
1    1154        89.4
2    1199        54.2
Run Code Online (Sandbox Code Playgroud)

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

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

id      load load_unit    fuel_consumption fuel_consumption_unit
--------------------------------------------------
1    1154  kW          89403              kg
2    1199  kW          54.2               t
Run Code Online (Sandbox Code Playgroud)

使用“单位”表,如果需要的话:

unit_id    unit_name
--------------------
kg         kilogramme
t          Tonne
Run Code Online (Sandbox Code Playgroud)

但是,此模型容易出现人为故障 - 很容易在不修改“load”列的情况下更改“load_unit”列,从而破坏数据。您无法对数据模型采取任何措施来避免这种情况。它还使常见查询变得相当棘手:想象一下尝试以一致的测量单位检索“负载”总量。

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