私の単純化された不自然な例は次のとおりです:-
世界中のすべての町の気温 (およびその他の値) を毎日測定して保存したいとしましょう。1 つの町のすべての気温を歴史的に取得するのと同じくらい簡単に、すべての町の現在の気温を取得できるように、データを保存する最適な方法を探しています。
解決するのは簡単な問題ですが、最善の解決策を探しています。
私が考えることができる2つの主なオプションは次のとおりです。
オプション 1 - 同じテーブルに現在のレコードと過去のレコードを格納
現在のレコードとアーカイブ レコードをすべて同じテーブルに格納します。
すなわち
CREATE TABLE [dbo].[WeatherMeasurement](
MeasurementID [int] Identity(1,1) NOT Null,
TownID [int] Not Null,
Temp [int] NOT Null,
Date [datetime] NOT Null,
)
これによりすべてがシンプルになりますが、町のリストと現在の気温を取得するための最も効率的なクエリは何でしょうか? テーブルに何百万行もあると、これはスケーリングされますか? テーブルに何らかの IsCurrent フラグを設定することで得られるものはありますか?
オプション 2 - すべてのアーカイブ レコードを別のテーブルに保存する
現在のライブ測定値を保存するテーブルがあります
CREATE TABLE [dbo].[WeatherMeasurement](
MeasurementID [int] Identity(1,1) NOT Null,
TownID [int] Not Null,
Temp [int] NOT Null,
Date [datetime] NOT Null,
)
そして、過去のアーカイブ日付を格納するテーブル (おそらくトリガーによって挿入されます)
CREATE TABLE [dbo].[WeatherMeasurementHistory](
MeasurementID [int] Identity(1,1) NOT Null,
TownID [int] Not Null,
Temp [int] NOT Null,
Date [datetime] NOT Null,
)
これには、スキーマがより複雑になり、データの挿入にかかるコストが高くなるという犠牲を払って、メインの現在のデータをスリムに保ち、クエリを非常に効率的に行うという利点があります。
最良の選択肢はどれですか? 私が言及していないより良いオプションはありますか?
注: 質問に的を絞るためにスキーマを単純化しましたが、毎日大量のデータ (100,000 レコード) が挿入され、データは 1 日分最新のものであると想定しています。現在のデータは、過去のデータと同じようにクエリされる可能性があります。