SQL 最佳数据库结构:NOAA 数据

SQL Optimal Database Structure: NOAA Data

我正在尝试将大量的日常天气数据存储到 postgreSQL 数据库中。这可能看起来不是很多数据,但大约有 95,000 个站点的每日数据可追溯到 100 年前。这可能意味着数百万条记录 (95,000 * 365 * 100) = 3,467,500,000。虽然这是一个高估,但对我来说,将所有日常数据存储在一个 table 中,并将站 ID 作为外键映射到另一个 table 与站信息似乎仍然不切实际。构建此数据以按站点查询数据系列的最佳方法是什么?我应该为每个站点创建一个 table(会产生 95,000 个 table),还是应该为每个区域尝试更广泛的东西,例如 table?有什么优点和缺点?非常感谢任何帮助。

我的数据是这样的:

Stations
*ID
-longitude
-latitude
-elevation
-country
-state
-name
...

Weather
*Station ID
*Date
-Precipitation
-High Temp
-Low Temp

这还不够信息。

您在优化什么:查询性能、磁盘使用率、更新速度?

  • 你的查询类型是什么运行?
  • 您是否通常为一个站获取 所有 数据(似乎不太可能)?日期范围?
  • 如果按日期查询,通常的解决方案是什么:日、月、年?
  • 这些是 'weather' table 中的所有字段,还是只是一个示例?
  • 您通常是检索单个值还是多个不同的值?
  • 您只是检索这些值,还是在数据库中执行 aggregation/analytics?
  • acceptable 查询性能对您来说是什么?

根据您对这些问题的回答,"bunch up" 您的数据可能有意义(每条记录存储超过一天;我假设 'date' 表示它是一天,或者它更细化吗?),以减少总行数。 Postgres 的 per-row 开销相对较高 - 在您的估计中,仅行 headers 将占用 ~75GB。

或者,您可能想调查这样的事情:https://github.com/citusdata/cstore_fdw

使用更多 table 的优点是更小的索引大小和(可能)物理数据局部性。在每个 station_id 一个 table 的极端情况下(not 在您的情况下不实用),您根本不需要 station_id 上的索引,查询最终可能只是对您需要的数据进行简单的序列扫描。

缺点是许多数据库操作涉及对所有 table 的线性扫描(尤其是在计划期间),并且管理数据库更加复杂。

典型的建议是将 table 的数量保持在几百到 可能 几千。当然,除非你有一个非典型案例,并且你已经测试过它并且它适用于你。