我正在设计一个新的MySQL后端系统,我遇到了一个问题,我不确定设置我的表的最佳方法。假设我有一个名为 cities 的表。每个城市都与表格天气有关系,其中包含每个月的天气信息。简单来说,让我们说 cities 表的结构是:
---------------
| ID | Name |
---------------
| 1 | City1 |
| 2 | City2 |
| 3 | City2 |
---------------
天气方面,我有大约50个田地。对于一年中的每个月,我都有高温,低温,平均温度,平均降水量。拥有50列的表似乎效率低下,似乎很难添加新字段。我可以考虑的另一个选择是使用以下设置的表:
----------------------------------------------------
| ID | CityID | Type | Value | Unit | Month |
----------------------------------------------------
| 1 | 1 | high_temp | 50 | F | 1 |
| 2 | 1 | low_temp | 35 | F | 1 |
| 3 | 1 | avg_temp | 45 | F | 1 |
| 4 | 1 | avg_prec | 10 | IN | 1 |
| 5 | 2 | high_temp | 60 | F | 1 |
| 6 | 2 | low_temp | 50 | F | 1 |
| 7 | 2 | avg_temp | 55 | F | 1 |
| 8 | 2 | avg_prec | 2 | IN | 1 |
----------------------------------------------------
但是,我在数据库中有大约1000个城市,并将其扩展到数万个。拥有大约500万行的表似乎过多,我担心查询时间。
通过一对一的关系或一对多关系来设置它的最佳方式是什么?另外,对于创建复杂查询会更有效率,我会尝试根据多种天气特征搜索城市?
答案 0 :(得分:1)
目前您已展示未规范化的结构。想象一下这样的问题:
什么是高温大于30且低温的城市 然后在1月15日?
对于城市1,当最大温度和最小温度超过?
对于那些查询将是复杂的。 所有涉及几种类型温度的问题都会让你头疼。
最佳方法是将临时值移动到列中:
ID | CityID | HighTemp | LowTemp | AvgTemp | AvgPrec | Unit | Month |
现在,上面提到的查询只是简单的select语句,带有适当的where子句。您只需要问自己类似的问题,并考虑如何在具体模式中回答它。
并且相信,通过适当的索引,数百万行对于数据库引擎来说无关紧要。
答案 1 :(得分:0)
如果你的字段没有固定,那么你当前的结构是合理的。
如果我们谈论的是直立处理大数据的数据库,那么500万不是那么大的数字。您可以通过将索引放在要在查询中用作过滤器的字段来显着缩短查询周转时间。