关于Table_1主键选择、外键设置及表结构的技术咨询
表结构说明
Table_1
| Timestamp | Station | Value |
|---|---|---|
| 2022-08-09T11:15:00+02:00 | A | 12 |
| 2022-08-09T11:30:00+02:00 | A | 15 |
| ... | ... | ... |
| 2022-08-09T11:15:00+02:00 | X | 29 |
| 2022-08-09T11:30:00+02:00 | X | 40 |
注:Timestamp为15分钟间隔的重复时间戳,包含7天海量时序数据
Table_2
| Number_id | Station |
|---|---|
| 234562 | A |
| 452365 | B |
| ... | ... |
| 352364 | X |
问题解答
1. Table_1应选择哪一列作为Primary Key?
单靠任何一列都无法作为主键——Timestamp、Station都会重复,Value更不具备唯一性。最优方案是用Timestamp + Station作为联合主键,因为每个站点在同一时间点只会有一条记录,这个组合能唯一标识每一行数据。如果担心联合主键在某些场景下使用不便,也可以额外添加自增id列作为代理主键,但必须给Timestamp + Station设置唯一约束,确保数据唯一性。
2. Table_1中的Station列是否应设为关联Table_2的Foreign Key?
必须设置,理由如下:
- 保证数据一致性:避免Table_1出现Table_2中不存在的Station值,防止脏数据产生
- 提升关联效率:外键约束会自动在Table_1的Station列创建索引(多数数据库默认行为),后续关联Table_2查询站点信息时速度更快
只要数据写入是规范的(提前在Table_2维护好所有站点),外键带来的写入性能损耗可以忽略,远低于数据不一致带来的后续维护成本。
3. 是否需要调整Table_1的维度?因实际数据量较大。
是否调整取决于你的查询场景:
- 如果核心查询是按站点查历史时序数据,或按时间段查多站点数据,当前的单条记录结构没问题,但要做好索引优化:给
(Station, Timestamp)加复合索引(适配按站点查时间范围的场景),给(Timestamp, Station)加复合索引(适配按时间段查多站点的场景) - 如果单表数据量已导致查询卡顿,考虑分表:时序数据优先按时间分(按天/周拆分),也可按Station哈希分表,前者更适配多数时序查询场景
- 如果以分析类查询为主(如聚合统计),可以做预聚合:提前按小时/天计算每个站点的平均值、最大值等,存入汇总表,减少实时计算压力
内容的提问来源于stack exchange,提问作者AnAn
相关产品推荐
相关产品推荐

