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

Mysql 设计可存储不同值和各自指标的表格,mysql,database,Mysql,Database,您好,我需要有关为以下规则设计数据库表的帮助: 需要存储每天的天气数据。它需要存储系统定义的1或2个天气值 设计表时需要应用以下参数 如果天气高于100华氏度,我们需要存储数值和 指示天气高于阈值的列 如果天气低于20华氏度,我们需要存储数值和 指示天气低于临界值的列 如果天气高于40华氏度,低于80华氏度,我们需要 存储值和指示天气在范围内的列 如果天气低于40华氏度,高于80华氏度,我们需要 存储该值和指示天气不在状态的列 射程 提前感谢。如果您使用的是MySQL 5.7,您可以使用生成

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

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

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

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

  • 如果天气低于20华氏度,我们需要存储数值和 指示天气低于临界值的列

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

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


提前感谢。

如果您使用的是MySQL 5.7,您可以使用生成的列:

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;
如果使用早期版本的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;
代码可以工作,但经过简化,即缺少PKs、索引、FK约束和日期列。 我可能得到了错误的实际值和/或比较,但它可能会给你指明方向


当然,您可以为SELECT语句创建一个视图。如果您真的想存储这些值,那么我建议在WHEATHER表中增加四列(冷/热/in_range/out_of_range),并使用插入触发器填充它们,其中包含阈值表中的值。这样,您可以在以后更改阈值(在阈值中),而无需更改WHEATHER中的值。例如,如果您在50年前创建了数据库,那么50°F将被视为高温,而55°F则被视为高温(由于气候变化)。这取决于您的用例。视图提供“生命更新”,触发器提供“历史值”。

如果您使用的是MySQL 5.7,则可以使用生成的列:

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;
如果使用早期版本的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;
代码可以工作,但经过简化,即缺少PKs、索引、FK约束和日期列。 我可能得到了错误的实际值和/或比较,但它可能会给你指明方向



当然,您可以为SELECT语句创建一个视图。如果您真的想存储这些值,那么我建议在WHEATHER表中增加四列(冷/热/in_range/out_of_range),并使用插入触发器填充它们,其中包含阈值表中的值。这样,您可以在以后更改阈值(在阈值中),而无需更改WHEATHER中的值。例如,如果您在50年前创建了数据库,那么50°F将被视为高温,而55°F则被视为高温(由于气候变化)。这取决于您的用例。视图提供“生命更新”,触发器提供“历史值”。

因此,您需要输入天气列(temp),数据库应计算wether2列(高于阈值/在范围内等)。您是否将其与后端编程语言(如PHP)一起使用?如果是,您可以应用后端逻辑,只保存温度值(例如100华氏度),然后使用If-else检查条件并显示消息(例如高于阈值)。我建议您不要存储此额外列。相反,当您要在其中一个组中选择行时,请将这些条件应用于搜索条件,或创建4个执行此操作的视图。然后,如果条件发生变化,您需要做的就是修改SQL搜索条件,而不是对数据库执行一些复杂的修改。您的第四点:温度如何可以低于40华氏度和高于80华氏度?@ZahiroMor:我们可以将此视为静态输入,但适用于不同的国家。不同的国家会对这些参数进行不同的设置。因此,您希望输入weather列(temp)和数据库应计算wether2列(高于阈值/在范围内等),您是否将其与后端编程语言(如PHP)一起使用?如果是,您可以应用后端逻辑,只保存温度值(例如100华氏度),然后使用If-else检查条件并显示消息(例如高于阈值)。我建议您不要存储此额外列。相反,当您要在其中一个组中选择行时,请将这些条件应用于搜索条件,或创建4个执行此操作的视图。那么,如果条件发生变化,你所需要做的就是修改SQL搜索条件,而不是对数据库执行一些复杂的修改。你的第四点:温度怎么可能低于40华氏度和高于80华氏度?@ZahiroMor:我们可以将此视为静态条目,但适用于不同的国家。不同的国家会对这些参数进行不同的设置。OP希望专门存储4个指定的不同值。@Golden_flash True,并且我的阈值也不是他的。我只是想展示一个可能的解决方案,而不是为他写完整的DDL。@Golden_flash:是的,你是对的。我想存储这个值。比如说,对于一个国家X,值可能是100华氏度(高于阈值),20华氏度(低于阈值),(40华氏度-80华氏度),范围是(40-90华氏度)范围值。对于国家Y,值将不同。但是,我们需要存储same@PerlDog:谢谢你的回答。但是我如何继续存储范围值及其相应的指示器。啊,我误解了。例如,佛罗里达州的温度为50°F,而阿拉斯加的温度为50°F。嗯,我会考虑的。OP想具体说明一下