Я работаю над всемирной службой планирования, которая использует физические местоположения в разных часовых поясах. Эти часовые пояса должны сохраняться в базе данных вместе с каждым местоположением. Вопрос в том, как они лучше всего хранятся?Сохранение временных зон на сервере SQL
В настоящее время мы используем таблицу пользовательского часового пояса, которая отображает индивидуальные идентификаторы целого числа в идентификаторы строки часового пояса Microsoft. Вместо этого я хочу сохранить идентификаторы часовых поясов IANA. Наша база данных - это SQL Server, к которому обращаются на C#, используя Entity Framework 6. Мы обрабатываем время с помощью NodaTime. Решение должно хорошо работать со всеми этими технологиями.
Я вижу два способа сделать это:
- Просто хранить идентификатор IANA в виде строки вместе с каждым местом.
- Сохраните все идентификаторы IANA в отдельной таблице и используйте для этого ссылку на внешний ключ.
Первое решение, вероятно, является самым простым, так как оно легко позволяет вводить новые идентификаторы, и оно тесно связывает данные. Это, однако, имеет недостаток в использовании большого пространства.
Второе решение требует от нас присоединиться к таблице часовых поясов каждый раз, когда нам нужен часовой пояс, что довольно часто, но для этого требуется мало места. При необходимости в эту таблицу должны быть добавлены новые идентификаторы часовых поясов. Он также вводит эти магические целые идентификаторы (используемый внешний ключ), которые могут быть ошибочно приняты как общеизвестные идентификаторы (в настоящее время у нас есть эта проблема, когда идентификаторы вышли из базы данных и в словарь в коде, используемый вместо таблица базы данных).
Поскольку я пишу это, мне интересно, возможно ли создать пользовательский часовой пояс UDT для SQL Server, где временные зоны могут быть сохранены и загружены как их строковые идентификаторы, но будут сохранены больше эффективно в скрытом от пользователя формате.
Почему бы просто не хранить все как UTC и не обрабатывать локализацию в клиентском приложении? – iamdave
Местом может быть, например, ресторан, в котором есть местные часы работы. Эти часы работы основаны на местоположении ресторана, а не на зрителях. Кроме того, мы планируем, поэтому будущие времена должны храниться в локальное время, чтобы они могли быть правильно преобразованы в зонированное время на основе часового пояса данного местоположения. Кроме того, один из клиентов - интерфейс JS, а JS - беспорядок, когда дело касается обработки часовых поясов и летнего времени. –
Хранение дат в местное время, как правило, плохая идея, так как изменение местного времени с летней экономией и т. Д. Если вы сохраняете все в UTC и сохраняете таблицу поиска по часовому поясу, вы можете адаптироваться к локальным изменениям, а также точно и просто конвертировать в любой часовой пояс, будь то пользователь или местоположение как в будущем, так и в прошлом.Пытаясь сохранить его как локальный, вы получите гораздо большие головные боли, чем просто попытку отобразить его как локальный. – iamdave