データマート/倉庫でのタイムゾーンの処理


12

私たちはデータマート/倉庫のビルディングブロックを設計し始めており、すべてのタイムゾーンをサポートできる必要があります(私たちのクライアントは世界中から来ています)。オンライン(および本)でのディスカッションを読むと、一般的な解決策は、ファクトテーブルに日付と時刻の個別のディメンションとタイムスタンプを持つことです。

しかし、私が答えるのに苦労している質問は、動的なタイムゾーンの要件を考慮すると、日付と時刻のディメンションが実際にどのように役立つかです。時間ディメンションはもう少し理にかなっていますが、日付ディメンションで苦労しています。日付ディメンションの一般的な設計アプローチには、通常、曜日名、曜日、月名などのプロパティが含まれます。私が抱えている問題は、2013年12月31日火曜日の午後11時(UTC)が水曜日であることです。 、2014年1月1日、UTC + 2以降のすべてのタイムゾーン。

したがって、すべてのクエリ(およびレポート)でこれらすべてのタイムゾーン変換を行う必要がある場合、おそらく使用しない(これらのプロパティのように)これらのプロパティを保持して保存することの意味は何ですか?一部の人々は、タイムゾーンごとにファクト行を持つことを提案しますが、それは私にはばかげているようです。毎月何百万ものレコードを保存できる必要があります。

他の人は、タイムゾーンブリッジテーブルを使用することをお勧めします。これは、ある程度の意味がありますが、クライアントアプリとレポートが日付から簡単に理解できるはずのことを達成するための追加の複雑さと結合のようにも見えます(レポートは主にWebベースになります)日付の変換、表示、およびフォーマットを支援する無数のライブラリがあります)。

私が考えることができる唯一のことは、日付と時間でグループ化することの容易さとおそらくパフォーマンスですが、日付部分でグループ化することはどれほど悪いことですか(MS SQLを使用していますが、数百万の行をクエリすることになります)、または考慮する必要があります月曜日などのほとんどのリテラルはタイムゾーンが機能するときにあまり意味がないので、ほとんどの場合、時間、日、月、年の数以下の非常に単純な日付と時刻のディメンションですか?


1
私はあなたがしているのはdatetimeoffsetデータ型であり、すべての日付をUTC表現で格納すると思います。次に、データを抽出する必要がある場合は、データをUTC値でクエリし、クライアントにローカル時間でデータを表現させます。
アランS.ハンセン

6
時間に関係なく日付を保存したい理由は考えられません。すべてをUTC日時として保存し、プレゼンテーションレイヤーでローカライズを考慮します。
billinkc 2013年

1
@billinkcに同意します。タイムゾーンの変換を行うために日付と時刻を常に組み合わせて戻す場合に、日付と時刻を別々に格納することでどのような利点が得られるかはわかりません。
mmarie 2013年

2
@billinkc:「日付を時間に関係なく保存したいと思う理由はないと思います。」- できます。倉庫から立方体を作るときはいつでも。DateとTimeofDayディメンションを別々にすることは、一般的でベストプラクティスです。
ミッチウィート

@MitchWheatそれを理解するのを手伝ってくれませんか(おそらく回答を作成しています)?私は世界中で販売を行っている大人の会社で、グリニッジ標準時2300時に、売り上げが急増しています。私はスライサーをレポートにドラッグします。米国東部および中部時間帯では、帰りにパッケージドドリンクを手に取ると売り上げがあるかもしれませんが、インドでは0330です。そして、パースの午前6時は、だれもがすごく下がっていますが、VBで歯を磨いているのは誰ですか。代わりに、人々は仕事の後に酒を買うので1700ishですが、それから日付の境界について心配する必要があります
billinkc 2014年

回答:


7

まず...

次元と次元に分離Datime/Timeすることは間違いなく進むべき道です。DateTime

複数のタイムゾーンを管理するには、DateKeyおよびを複製しTimeKeyて、次のようにする必要があります。

  • LocalDateKey
  • LocalTimeKey
  • UtcDateKey
  • UtcTimeKey

あなたは言う...

私が抱えている問題は、2013年12月31日火曜日の午後11時(UTC)が、UTC + 2以降のすべてのタイムゾーンで2014年1月1日水曜日であることです。

上記の4つの列を使用すると、テーブルエイリアスを使用して、ファクトテーブルを日付および/または時間ディメンションに結合できます(キンボール用語では、これらのエイリアスディメンションテーブルは「ロールプレイングディメンション」と呼ばれます)。次のようなものになります:

/*
    Assumes the following:
        - [DateLongName] has the format of this example "Tuesday, December 31, 2013"
        - [TimeShortName] has the format of this example "11:00 PM"
        - Both [DateLongName] & [TimeShortName] are strings
*/
select
    -- Returns a string matching this example  "11:00 PM Tuesday, December 31, 2013"
    localTime.TimeShortName + ' ' + localDate.DateLongName
    ,utcTime.TimeShortName + ' ' + utcDate.DateLongName
    ,f.*
from
    FactTableName  AS f

    -- Local Date and Local Time joins          
    inner join dbo.Date  AS localDate
        on localDate.DateKey = f.LocalDateKey

    inner join dbo.Time  AS localTime
        on localTime.TimeKey = f.LocalTimeKey 

    -- Utc Date and Utc Time joins    
    inner join dbo.Date  AS utcDate
        on utcDate.DateKey = f.UtcDateKey

    inner join dbo.Time  AS utcTime
        on utcTime.TimeKey = f.UtcTimeKey 

最後に...

あなたはOLTPデータベースをデータマートを構築し、していないとして、ローカル時刻とUTC時刻の世代は、あなたのETLで実行する必要がありしないで次のような理由から任意のクライアント側のアプリケーションでは(離れてUTC時刻の局在からへレポート読者の視点):

  • 計算をクエリに常駐させると、クエリに余分なパフォーマンス負荷がかかり、レポートに対してこのクエリを実行する必要がある回数が乗算されます(これは数百万の行を読み取る場合に重要です)。
  • 各クエリで計算が正しく維持されるようにするための追加の負担(特に夏時間を考慮に入れる場合)
  • クエリがシークではなくインデックススキャンを実行するように列で計算を実行するため、列が含まれるインデックスの範囲スキャンを防止します(通常、各データページを読み取る必要があるため、よりコストがかかります); これは検索不可として知られています。
    • コメントによる編集:これは、変換を実際のクエリにプッシュする場合に適用されます
  • この概念を取って、これを呼び出すことによって、それを拡張するからあなたを止めるものは何もありません、利用可能な追加UTCの日付と時刻を持つという概念を用いてStandardisedDateKey、またはCorporateHQDateKey、代わりにUTC日付テーブルのあなたは、いくつかの他に基づいて標準化どこ事業合意標準を
  • 2つの別個の列タイプ(ローカルとUTC)があるため、地理的な距離を横に並べて比較できます。考える->オーストラリアの誰かがローカルとUTCの両方でタイムスタンプが付けられたレコードを入力すると、ニューヨークの誰かがローカル(オーストラリア)の日付と時刻、およびニューヨークのUTC日付と時刻を含むレポートを読み取り、それによって何かが表示されます。彼らのオーストラリアの対応は、真昼中に(オーストラリア時間)真夜中に彼らの時間(ニューヨーク時間)に起こりました。この時間の比較は、多国籍企業では不可欠です。

なぜ別の使用DateTime寸法の代わりに、単一のDateTime?ファクトテーブルには複数の日付が含まれる場合があり、それぞれ1つではなく2つのINTを格納すると、合計が生じる可能性があります。
Jon of All Trades

1
@Jon of All Trades:個別の日付と時刻のディメンションは、一般的なベストプラクティスです。全体的なディメンションのカーディナリティが削減されます。実際には、日付と時刻の両方でスライスするか、日付でフィルタリングしてから時間でスライスすることがよくあります。
ミッチ小麦

0

この回答が簡潔であることをあらかじめお詫びし、私が勤務していないときは詳しく説明する予定です。

日付と時刻のテーブルを使用すると、データを簡単に集計できるという利点があります。多くの場合、それはその性質のものを月または営業日でソートする最も簡単な方法です。ただし、これは必ずしもタイムスタンプの有用性を置き換えるものではありません。特定のケースでは、UTCタイムスタンプ。タイムスタンプを取得したら、レポートまたはプレゼンテーションレイヤーでタイムスタンプを現地時間に変更するだけです。範囲スキャンを回避するために、リクエスト範囲もUTC時間に変換していることを確認してください。

他の質問やコメントがありましたら遠慮なくお尋ねください。


1
これは質問の答えにはなりません。
ミッチウィート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.