2016-12-06 10 views
0

다른 시간대의 물리적 위치를 사용하는 월드 와이드 일정 서비스에서 작업하고 있습니다. 이 표준 시간대는 각 위치와 함께 데이터베이스에 유지되어야합니다. 질문은, 어떻게 저장하는 것이 가장 좋은가요?SQL 서버에 시간대 저장

현재 사용자 지정 정수 ID를 Microsoft 표준 시간대 문자열 식별자에 매핑하는 사용자 지정 표준 시간대 테이블을 사용합니다. 대신 IANA 시간대 식별자를 저장하고 싶습니다. 우리 데이터베이스는 C#에서 Entity Framework 6을 사용하여 액세스하는 SQL Server입니다. 우리는 NodaTime을 사용하여 시간을 처리합니다. 솔루션은 이러한 모든 기술과 잘 작동해야합니다.

  1. 단순히 각 위치와 함께 문자열로 IANA ID를 저장 :

    나는 그것을 할 수있는 두 가지 방법을 참조하십시오.
  2. 모든 IANA 식별자를 별도의 테이블에 저장하고 외부 키를 사용하여 링크합니다.

첫 번째 해결책은 새로운 식별자를 쉽게 허용하고 데이터를 긴밀하게 유지하기 때문에 아마도 가장 쉬운 방법 일 것입니다. 그러나 많은 공간을 사용하는 단점이 있습니다.

두 번째 솔루션을 사용하려면 시간대가 필요할 때마다 표준 시간대 테이블에 가입해야합니다. 필요한 경우 새 표준 시간대 식별자를 해당 테이블에 추가해야합니다. 또한이 마법의 정수 ID (외래 키 사용)를 소개합니다.이 ID는 일반적으로 알려진 식별자로 오인 될 수 있습니다 (현재 ID가 데이터베이스 외부로 이동하여 ID 대신 사용 된 인 코드 사전으로 이동 됨). 데이터베이스 테이블).

시간대를 저장하고 문자열 식별자로로드 할 수있는 SQL Server 용 사용자 지정 표준 시간대 UDT를 만들 수도 있지만 더 궁금합니다. 효율적으로 사용자가 숨겨진 형식으로.

+0

모든 것을 UTC로 저장하고 클라이언트 응용 프로그램에서 현지화를 처리하지 않는 이유는 무엇입니까? – iamdave

+0

위치는 예를 들어 현지 영업 시간이있는 식당 일 수 있습니다. 이 영업 시간은 식당의 위치를 ​​기반으로하며 뷰어의 위치는 아닙니다. 또한 스케줄링을 수행하므로 미래 시간은 현지 시간으로 저장되어야하므로 주어진 위치의 시간대를 기반으로 구역 시간으로 올바르게 변환 될 수 있습니다. 또한 클라이언트 중 하나는 JS 프론트 엔드이며 JS는 표준 시간대 및 일광 절약 시간제를 처리 할 때 엉망입니다. –

+1

일광 절약 시간제 등으로 현지 시간이 변경되면 일반적으로 현지 시간으로 날짜를 저장하는 것은 좋지 않습니다. 모든 항목을 UTC로 저장하고 시간대 조회 테이블을 유지하면 현지 변경 사항을 적용 할 수있을뿐만 아니라 모든 시간대, 미래 또는 과거의 사용자 또는 위치 일 수 있습니다.로컬로 저장하려고하면 단순히 로컬로 표시하려고하는 것보다 훨씬 큰 두통이 생깁니다. – iamdave

답변

2

어느 방법을 사용해도 효과가 있지만 일반적인 관례는 IANA 시간대 식별자를 문자열로 저장하는 것입니다. 그것들은 정말로 유일한 식별자이므로, 그것들처럼 취급 될 수 있습니다. "America/Argentina/ComodRivadavia"은 현재 최대 문자열이며 32 자입니다. 따라서 varchar(32)이면 충분합니다. 하지만, 나는 일반적으로 미래 안전을 위해서 varchar(50)을 사용합니다.

룩업 테이블로 정규화하여 저장할 수있는 몇 킬로바이트의 저장 공간은 일반적으로 IMHO의 성능에 영향을주지 않습니다. 그러나 어떤 트레이드 오프와 마찬가지로 두 옵션을 모두 평가하여 시나리오에서 어떤 것이 더 효과적인지 확인해야합니다. 찾아보기 테이블을 사용하는 데 반드시 일 필요는 없습니다.