Вот мой упрощенный и надуманный пример: -
Допустим, я хочу измерять и хранить температуру (и другие значения) во всех городах мира на ежедневной основе. Я ищу оптимальный способ хранения данных, чтобы было так же легко получить текущую температуру во всех городах, как и исторически получить всю температуру в одном городе.
Это достаточно простая проблема, но я ищу лучшее решение.
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 записей), а данные актуальны в течение одного дня. Текущие данные будут так же вероятны, как и исторические.