|
我的简化人为示例如下:
8 u( L+ s( C+ c: ^可以说,我想每天测量和存储世界上所有城镇的温度(和其他值)。我正在寻找一种存储数据的最佳方式,以使获取所有城镇中的当前温度与获取一个城镇历史上的所有温度一样容易。
) T3 H+ R N! [; M这是一个很容易解决的问题,但我正在寻找最佳解决方案。
' R* o) f3 H- K2 D我能想到的2个主要选项如下: ]9 f4 o, l b1 o8 Z+ G
选项1-同一张表存储当前和历史记录+ E# i& s# u* X* [9 G( _
将所有当前记录和归档记录存储在同一表中。( ?; S% D/ I! y, ~
IE! r& @& e8 \8 ^
CREATE TABLE [dbo].[WeatherMeasurement]($ P8 m4 t* W" o# J( w+ X
MeasurementID [int] Identity(1,1) NOT Null,+ L" a% p) o! x$ O$ i- O+ K
TownID [int] Not Null,9 K) c( t. `0 u2 q
Temp [int] NOT Null,
! }1 V4 A, H$ i3 m4 m- ]2 w' g Date [datetime] NOT Null,% {9 @' s; Y) n+ M
)) V) \% P+ `; s) ~3 M6 O* ^( H" [
这将使所有事情变得简单,但是最有效的查询是获取城镇列表和当前温度的列表呢?一旦表中有数百万行,这种规模会扩展吗?通过在表中使用某种IsCurrent标志可以获得什么?+ @; [- `/ t& g, ~+ n0 t
选项2-将所有存档记录存储在单独的表中
+ b4 k# S1 ^) o" l7 q将会有一个表格来存储当前的实时测量结果" [- ^& H# Q. a0 Y- q7 U
CREATE TABLE [dbo].[WeatherMeasurement](
0 z2 p+ L& ]3 G" V2 l' P" X MeasurementID [int] Identity(1,1) NOT Null,: I' S8 i! g( h, l, _7 M: n
TownID [int] Not Null,
]+ `) R0 l: E& q: v- K" l) T- C Temp [int] NOT Null,' _+ _: m0 y$ x5 `4 n; U! Q4 }
Date [datetime] NOT Null,- K2 E6 u. T" w+ J' S! D% w+ f: V
)
/ Z. a- e% R! @& U0 M还有一个用于存储历史存档日期的表(也许是由触发器插入的)9 s1 M! s/ i3 l8 C" W
CREATE TABLE [dbo].[WeatherMeasurementHistory]( }. I b/ |' ?% C
MeasurementID [int] Identity(1,1) NOT Null,
& e( D- D! n: \3 z. p; r+ s# x ^9 t TownID [int] Not Null,. C/ M% \9 L6 v1 e
Temp [int] NOT Null,
( I$ \* E; ]7 r% Y# D9 j2 f) N Date [datetime] NOT Null,0 S7 R: y5 h3 L& V
)
, D2 j6 z) a1 [0 E2 S2 c这样做的好处是保持主要的当前数据精简,并且非常有效地进行查询,但以使方案更复杂和插入数据更昂贵为代价。
+ ]# E% s( h+ ?( S8 ]4 Y' l: L6 c7 \哪个是最好的选择?有没有我没有提到的更好的选择?
1 @# V$ V0 j, J' V. B1 B注意:我已经简化了架构以帮助更好地解决我的问题,但是假设每天将插入大量数据(100,000条记录),并且数据是一天之内的最新数据。当前数据与历史数据一样可能被查询。
& R$ ? V$ p; |
0 p9 }* x1 g- e, M5 Y解决方案:9 h8 P0 M% u+ T* {) _' ] l
( l k" t' ^2 _/ w& y
5 O4 ~' {8 ]8 o% a/ r) J5 {9 [3 k4 l" Y% l" s! n/ L
它取决于应用程序的使用方式…如果使用方式指示将比当前值更频繁地查询历史数据,则将它们全部放在一个表中…但是如果历史查询是例外,则(或小于10%的查询),并且更常见的当前值查询的性能会因为将所有数据放在一个表中而受损,然后将这些数据分离到自己的表中是很有意义的… |
|