2016-12-06 6 views
0

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

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

Я вижу два способа сделать это:

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

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

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

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

+0

Почему бы просто не хранить все как UTC и не обрабатывать локализацию в клиентском приложении? – iamdave

+0

Местом может быть, например, ресторан, в котором есть местные часы работы. Эти часы работы основаны на местоположении ресторана, а не на зрителях. Кроме того, мы планируем, поэтому будущие времена должны храниться в локальное время, чтобы они могли быть правильно преобразованы в зонированное время на основе часового пояса данного местоположения. Кроме того, один из клиентов - интерфейс JS, а JS - беспорядок, когда дело касается обработки часовых поясов и летнего времени. –

+1

Хранение дат в местное время, как правило, плохая идея, так как изменение местного времени с летней экономией и т. Д. Если вы сохраняете все в UTC и сохраняете таблицу поиска по часовому поясу, вы можете адаптироваться к локальным изменениям, а также точно и просто конвертировать в любой часовой пояс, будь то пользователь или местоположение как в будущем, так и в прошлом.Пытаясь сохранить его как локальный, вы получите гораздо большие головные боли, чем просто попытку отобразить его как локальный. – iamdave

ответ

2

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

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