【发布时间】: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 pressure和room作为另一列,这样会更容易维护和查询 -
在同一个时间戳,同一个度量有不同的值吗?总是这样吗?
-
如果您总是一次查询所有数据(因此一次查询 1 个房间的所有数据),您可以考虑将数据存储为每个房间的 1 条记录,并为真实数据使用 JSON(XML 或其他)结构.
-
@vkp。关于您的第二条评论,对于给定的参数/位置和时间戳,将只有一个值。我的示例数据中可能有一些错误
-
规范化是适合您的案例的方法。这些列将是
address、timestamp、room_id、parameter、value。将值列设为varchar,这样您就可以存储on/off和decimals。
标签: mysql sql database-design normalization