设计表可以存储不同的值和各自的指标

时间:2016-02-28 12:56:01

标签: mysql database

您好我需要帮助设计以下规则的数据库表:

需要存储每天天气的数据。它需要存储系统定义的1或2个天气值。

设计表时需要应用以下参数。

  • 如果天气高于100华氏度,我们需要存储价值和 指示天气高于阈值的栏

  • 如果天气低于20华氏度,我们需要存储价值和 指示天气低于阈值的栏

  • 如果天气高于40华氏度,低于80华氏度,我们需要 存储值和指示天气在范围内的列

  • 如果天气低于40华氏度,高于80华氏度,我们需要 存储值和指示天气不在的列 范围

提前致谢。

1 个答案:

答案 0 :(得分:2)

如果您使用的是MySQL 5.7,则可以使用GENERATED COLUMNS:

create table wheather (
  temp int,
  hot  int generated always as (if(temp>30,1,0)) virtual,
  cold int generated always as (if(temp<20,1,0)) virtual
);

insert into wheather (temp) values (10), (20), (30), (40);
select * from wheather;

给出:

temp    hot    cold
-------------------
10      0      1
20      0      0
30      0      0
40      1      0

如果使用早期版本的MySQL,例如5.5,请使用同样的视图。

更新:根据评论,我了解到不同地点的阈值会有所不同。 鉴于此,我建议使用第二个表来保存每个位置的阈值 加入两个表:

create table wheather (
    location char(20),
    temp     int
);

insert into wheather (location, temp) values 
    ('Florida', 10), ('Florida', 20), ('Florida', 30), ('Florida', 40),
    ('Alaska', 10),  ('Alaska', 20),  ('Alaska', 30),  ('Alaska', 40);

create table thresholds (
    location        char(20),
    low             int,
    high            int,
    inrange_lower   int,
    inrange_upper   int,
    outrange_lower  int,
    outrange_upper  int
);

insert into thresholds values 
    ('Florida', 30, 60, 35, 45, 20, 50),        
    ('Alaska',  10, 30, 15, 25,  5, 40);

select w.location,
       w.temp, 
       if(w.temp < t.low,'yes','no') as cold,
       if(w.temp > t.high,'yes','no') as hot,
       if(w.temp between t.inrange_lower and t.inrange_upper,'yes','no') as in_range,
       if(w.temp < t.outrange_lower or w.temp > t.outrange_upper,'yes','no') as out_of_range
  from wheather w left join thresholds t on w.location=t.location;

给出:

+----------+------+------+-----+----------+--------------+
| location | temp | cold | hot | in_range | out_of_range |
+----------+------+------+-----+----------+--------------+
| Florida  |   10 | yes  | no  | no       | yes          |
| Florida  |   20 | yes  | no  | no       | no           |
| Florida  |   30 | no   | no  | no       | no           |
| Florida  |   40 | no   | no  | yes      | no           |
| Alaska   |   10 | no   | no  | no       | no           |
| Alaska   |   20 | no   | no  | yes      | no           |
| Alaska   |   30 | no   | no  | no       | no           |
| Alaska   |   40 | no   | yes | no       | no           |
+----------+------+------+-----+----------+--------------+
8 rows in set (0.00 sec)

代码可以工作,但是很简单,即它缺少PK,INDEXE,FK约束和DATE列。 而且我可能已经得到了实际值和/或比较错误,但它可能会指向您的方向。

当然,您可以为SELECT语句创建视图。如果你真的想存储这些值,那么我建议在WHEATHER表中添加四个额外的列(cold / hot / in_range / out_of_range),并使用INSRES触发器和THRESHOLD表中的值填充它们。这样,您可以在以后更改阈值(在THRESHOLDS中)而不更改WHEATHER中的值。例如,如果您在50年前创建了数据库,那么50°F将被认为是 hot ,而同时55°F是热的(由于气候变化)。这取决于您的使用案例。视图给出了“生命更新”,触发器给出了“历史值”。