다른 시간대의 물리적 위치를 사용하는 월드 와이드 일정 서비스에서 작업하고 있습니다. 이 표준 시간대는 각 위치와 함께 데이터베이스에 유지되어야합니다. 질문은, 어떻게 저장하는 것이 가장 좋은가요?SQL 서버에 시간대 저장
현재 사용자 지정 정수 ID를 Microsoft 표준 시간대 문자열 식별자에 매핑하는 사용자 지정 표준 시간대 테이블을 사용합니다. 대신 IANA 시간대 식별자를 저장하고 싶습니다. 우리 데이터베이스는 C#에서 Entity Framework 6을 사용하여 액세스하는 SQL Server입니다. 우리는 NodaTime을 사용하여 시간을 처리합니다. 솔루션은 이러한 모든 기술과 잘 작동해야합니다.
- 단순히 각 위치와 함께 문자열로 IANA ID를 저장 : 나는 그것을 할 수있는 두 가지 방법을 참조하십시오.
- 모든 IANA 식별자를 별도의 테이블에 저장하고 외부 키를 사용하여 링크합니다.
첫 번째 해결책은 새로운 식별자를 쉽게 허용하고 데이터를 긴밀하게 유지하기 때문에 아마도 가장 쉬운 방법 일 것입니다. 그러나 많은 공간을 사용하는 단점이 있습니다.
두 번째 솔루션을 사용하려면 시간대가 필요할 때마다 표준 시간대 테이블에 가입해야합니다. 필요한 경우 새 표준 시간대 식별자를 해당 테이블에 추가해야합니다. 또한이 마법의 정수 ID (외래 키 사용)를 소개합니다.이 ID는 일반적으로 알려진 식별자로 오인 될 수 있습니다 (현재 ID가 데이터베이스 외부로 이동하여 ID 대신 사용 된 인 코드 사전으로 이동 됨). 데이터베이스 테이블).
시간대를 저장하고 문자열 식별자로로드 할 수있는 SQL Server 용 사용자 지정 표준 시간대 UDT를 만들 수도 있지만 더 궁금합니다. 효율적으로 사용자가 숨겨진 형식으로.
모든 것을 UTC로 저장하고 클라이언트 응용 프로그램에서 현지화를 처리하지 않는 이유는 무엇입니까? – iamdave
위치는 예를 들어 현지 영업 시간이있는 식당 일 수 있습니다. 이 영업 시간은 식당의 위치를 기반으로하며 뷰어의 위치는 아닙니다. 또한 스케줄링을 수행하므로 미래 시간은 현지 시간으로 저장되어야하므로 주어진 위치의 시간대를 기반으로 구역 시간으로 올바르게 변환 될 수 있습니다. 또한 클라이언트 중 하나는 JS 프론트 엔드이며 JS는 표준 시간대 및 일광 절약 시간제를 처리 할 때 엉망입니다. –
일광 절약 시간제 등으로 현지 시간이 변경되면 일반적으로 현지 시간으로 날짜를 저장하는 것은 좋지 않습니다. 모든 항목을 UTC로 저장하고 시간대 조회 테이블을 유지하면 현지 변경 사항을 적용 할 수있을뿐만 아니라 모든 시간대, 미래 또는 과거의 사용자 또는 위치 일 수 있습니다.로컬로 저장하려고하면 단순히 로컬로 표시하려고하는 것보다 훨씬 큰 두통이 생깁니다. – iamdave