Сохранение временных зон на SQL Server

Я работаю над всемирной службой планирования, которая использует физические местоположения в разных часовых поясах. Эти часовые пояса должны сохраняться в базе данных вместе с каждым местоположением. Вопрос в том, как их лучше всего хранить?

В настоящее время мы используем таблицу пользовательского часового пояса, в которой сопоставляются индивидуальные идентификаторы целого числа с идентификаторами строки часового пояса Microsoft. Вместо этого я хочу сохранить идентификаторы часовых поясов IANA. Наша база данных - это SQL Server, доступ к которой осуществляется на C # с использованием Entity Framework 6. Мы обрабатываем время с использованием NodaTime. Решение должно хорошо работать со всеми этими технологиями.

Я вижу два разных способа сделать это:

  1. Просто сохраните идентификатор IANA в виде строки вместе с каждым местоположением.
  2. Храните все идентификаторы IANA в отдельной таблице и используйте внешний ключ для связи с ним.

Первое решение, вероятно, является самым простым, так как оно легко позволяет создавать новые идентификаторы и тесно связывает данные. Однако у него есть недостаток в использовании большого количества места.

Второе решение требует, чтобы мы присоединились к таблице часовых поясов каждый раз, когда нам нужен часовой пояс, что довольно часто, но требует небольшого пространства. При необходимости в эту таблицу должны добавляться новые идентификаторы часовых поясов. Он также вводит эти магические идентификаторы целого числа (используемый внешний ключ), которые могут быть ошибочными как общеизвестные идентификаторы (в настоящее время у нас есть эта проблема, когда идентификаторы вышли из базы данных и в словарь в коде, используемый вместо базы данных Таблица).

Поскольку я пишу это, мне интересно, может ли быть возможно создать пользовательский часовой пояс UDT для SQL Server, где часовые пояса могут быть сохранены и загружены как их строковые идентификаторы, но будут храниться более эффективно у пользователя - скрытый формат.

c#,sql-server,timezone,nodatime,iana,

0

Ответов: 1


4 принят

Хотя любой из этих подходов будет работать, обычной практикой является только сохранение идентификатора часового пояса IANA в виде строки. Они действительно уникальные идентификаторы, поэтому их можно рассматривать как таковые. "America/Argentina/ComodRivadavia"в настоящее время самая большая строка, 32 символа - так varchar(32)что хватит. Хотя, я обычно использую varchar(50)просто для будущего.

Несколько килобайт хранилища, которые вы можете сэкономить, нормализуясь к таблице поиска, обычно не стоят за первичное воздействие соединения, IMHO. Однако, как и любой компромисс, вы должны оценить оба варианта, чтобы увидеть, что лучше работает для вашего сценария. Не обязательно неправильно использовать таблицу поиска.

C #, SQL-сервер, часовой пояс, nodatime, IANA,
Похожие вопросы