【问题标题】:Time stamped SQL storage of changing data types更改数据类型的时间戳 SQL 存储
【发布时间】:2015-10-05 01:05:23
【问题描述】:

我需要在 SQL 数据库中存储各种时间戳数据参数。请参阅下面的典型非标准化数据,其中我显示了五个模拟值(室温、室内湿度、游泳池 pH 值、AHU 供应温度和室内压力)和一个二进制值(光照状态)。

不同的“客户”将拥有我在下面用“地址”字段指示的数据。通常将添加或删除要存储的给定参数。此外,通常会添加以前未存档的新变量(即冷冻水供应温度),并且无法事先知道将来可能需要存储哪些参数。

一个典型的查询是返回给定时间跨度内 123 Main Street Room 102 的温度。另一个典型的查询是返回 123 Main Street 中所有房间的温度、湿度和光照水平。

为每个所需参数向表中添加列显然没有意义。但我也很难在同一列中存储不同类型的数据。我也很苦恼如何在许多参数中复制房间号并觉得它应该被标准化,但是,其他参数没有关联的房间号,所以我不知道这将如何工作。我还质疑我是否应该创建一个 PK 是建筑物和时间戳组合的表,并加入另一个包含参数和值(可能还有类型)列的表。

应该如何对这些数据建模?

+------------------+-----------------+------------------------+-------+
|     Address      |    Timestamp    |       Parameter        | Value |
+------------------+-----------------+------------------------+-------+
| 123 Main Street  | 7/13/2015 16:00 | Room 101 Temperature   | 70.99 |
| 123 Main Street  | 7/13/2015 16:00 | Room 101 Humidity      | 50%   |
| 123 Main Street  | 7/13/2015 16:00 | Room 101 Light Status  | Off   |
| 123 Main Street  | 7/13/2015 16:00 | Room 102 Temperature   | 70.90 |
| 123 Main Street  | 7/13/2015 16:00 | Room 102 Humidity      | 50%   |
| 123 Main Street  | 7/13/2015 16:00 | Room 102 Light Status  | Off   |
| 123 Main Street  | 7/13/2015 16:00 | Room 103 Temperature   | 69.95 |
| 123 Main Street  | 7/13/2015 16:00 | Room 103 Humidity      | 49%   |
| 123 Main Street  | 7/13/2015 16:00 | Room 103 Light Status  | Off   |
| 123 Main Street  | 7/13/2015 16:15 | Room 101 Temperature   | 69.65 |
| 123 Main Street  | 7/13/2015 16:15 | Room 101 Humidity      | 47%   |
| 123 Main Street  | 7/13/2015 16:15 | Room 101 Light Status  | On    |
| 123 Main Street  | 7/13/2015 16:15 | Room 102 Temperature   | 69.18 |
| 123 Main Street  | 7/13/2015 16:15 | Room 102 Humidity      | 46%   |
| 123 Main Street  | 7/13/2015 16:15 | Room 102 Light Status  | On    |
| 123 Main Street  | 7/13/2015 16:15 | Room 103 Temperature   | 68.49 |
| 123 Main Street  | 7/13/2015 16:15 | Room 103 Humidity      | 48%   |
| 123 Main Street  | 7/13/2015 16:15 | Room 103 Light Status  | On    |
| 123 Main Street  | 7/13/2015 16:30 | Room 101 Temperature   | 68.93 |
| 123 Main Street  | 7/13/2015 16:30 | Room 101 Humidity      | 49%   |
| 123 Main Street  | 7/13/2015 16:30 | Room 101 Light Status  | On    |
| 123 Main Street  | 7/13/2015 16:30 | Room 102 Temperature   | 69.44 |
| 123 Main Street  | 7/13/2015 16:30 | Room 102 Humidity      | 49%   |
| 123 Main Street  | 7/13/2015 16:30 | Room 102 Light Status  | Off   |
| 123 Main Street  | 7/13/2015 16:30 | Room 103 Temperature   | 69.63 |
| 123 Main Street  | 7/13/2015 16:30 | Room 103 Humidity      | 48%   |
| 123 Main Street  | 7/13/2015 16:30 | Room 103 Light Status  | Off   |
| 321 Front Street | 7/14/2015 14:00 | AHU Supply Temperature | 69.96 |
| 321 Front Street | 7/14/2015 14:00 | Swimming Pool PH       | 7.19  |
| 321 Front Street | 7/14/2015 14:00 | Room 101 Pressure      | 0.11  |
| 321 Front Street | 7/14/2015 14:15 | AHU Supply Temperature | 69.92 |
| 321 Front Street | 7/14/2015 14:15 | Swimming Pool PH       | 6.97  |
| 321 Front Street | 7/14/2015 14:15 | Room 101 Pressure      | 0.11  |
| 321 Front Street | 7/14/2015 14:30 | AHU Supply Temperature | 70.37 |
| 321 Front Street | 7/14/2015 14:30 | Swimming Pool PH       | 6.84  |
| 321 Front Street | 7/14/2015 14:30 | Room 101 Pressure      | 0.12  |
| 321 Front Street | 7/14/2015 14:45 | AHU Supply Temperature | 70.80 |
| 321 Front Street | 7/14/2015 14:45 | Swimming Pool PH       | 6.70  |
| 321 Front Street | 7/14/2015 14:45 | Room 101 Pressure      | 0.12  |
| 321 Front Street | 7/14/2015 15:00 | AHU Supply Temperature | 71.29 |
| 321 Front Street | 7/14/2015 15:00 | Swimming Pool PH       | 6.90  |
| 321 Front Street | 7/14/2015 15:00 | Room 101 Pressure      | 0.12  |
| 321 Front Street | 7/14/2015 15:15 | AHU Supply Temperature | 72.13 |
| 321 Front Street | 7/14/2015 15:15 | Swimming Pool PH       | 7.13  |
| 321 Front Street | 7/14/2015 15:15 | Room 101 Pressure      | 0.11  |
| 321 Front Street | 7/14/2015 15:30 | AHU Supply Temperature | 72.84 |
| 321 Front Street | 7/14/2015 15:30 | Swimming Pool PH       | 7.01  |
| 321 Front Street | 7/14/2015 15:30 | Room 101 Pressure      | 0.11  |
| 321 Front Street | 7/14/2015 15:45 | AHU Supply Temperature | 72.82 |
| 321 Front Street | 7/14/2015 15:45 | Swimming Pool PH       | 7.22  |
| 321 Front Street | 7/14/2015 15:45 | Room 101 Pressure      | 0.11  |
| 321 Front Street | 7/14/2015 16:00 | AHU Supply Temperature | 72.23 |
| 321 Front Street | 7/14/2015 16:00 | Swimming Pool PH       | 7.40  |
| 321 Front Street | 7/14/2015 16:00 | Room 101 Pressure      | 0.11  |
+------------------+-----------------+------------------------+-------+

【问题讨论】:

  • 有一个type的列来存储room temperature, room humidity, swimming pool pH, AHU supply temperature, room pressureroom作为另一列,这样会更容易维护和查询
  • 在同一个时间戳,同一个度量有不同的值吗?总是这样吗?
  • 如果您总是一次查询所有数据(因此一次查询 1 个房间的所有数据),您可以考虑将数据存储为每个房间的 1 条记录,并为真实数据使用 JSON(XML 或其他)结构.
  • @vkp。关于您的第二条评论,对于给定的参数/位置和时间戳,将只有一个值。我的示例数据中可能有一些错误
  • 规范化是适合您的案例的方法。这些列将是addresstimestamproom_idparametervalue。将值列设为varchar,这样您就可以存储on/offdecimals

标签: mysql sql database-design normalization


【解决方案1】:

我会选择 3 张桌子:

Address
-------
address_id
address_name

Location
--------
location_id
location_name
address_id

Measurement
-----------
meauserment_id
location_id
type
timestamp
value

这里所有的房间、游泳池和用品都被建模为不同的位置,所以类型将只是“温度”、“湿度”等。

对于您的查询,您需要在(location_id, type, timestamp) 上有一个复合二级索引。

如果同一地址可以有很多位置,并且您真的关心第二种查询的读取性能,那么(假设您可以允许自己忽略每个时间戳具有相同 location_id-type 的多个数据点)组织测量的最佳方式是:

Measurement
-----------
address_id
location_id
type
timestamp
value

您的 PK 将是 (address_id, location_id, type, timestamp) + 二级索引 (location_id, type, timestamp)

【讨论】:

  • 您可能只需为 5 个指标设置 5 个列。温度可以是FLOAT;湿度可以是TINYINT UNSIGNED;等等。这样做会简化代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 2018-06-24
相关资源
最近更新 更多