您好我需要帮助设计以下规则的数据库表:
需要存储每天天气的数据。它需要存储系统定义的1或2个天气值。
设计表时需要应用以下参数。
如果天气高于100华氏度,我们需要存储价值和 指示天气高于阈值的栏
如果天气低于20华氏度,我们需要存储价值和 指示天气低于阈值的栏
如果天气高于40华氏度,低于80华氏度,我们需要 存储值和指示天气在范围内的列
如果天气低于40华氏度,高于80华氏度,我们需要 存储值和指示天气不在的列 范围
提前致谢。
答案 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是热的(由于气候变化)。这取决于您的使用案例。视图给出了“生命更新”,触发器给出了“历史值”。