Kami mulai merancang blok bangunan data mart / gudang dan kami harus dapat mendukung semua zona waktu (klien kami berasal dari seluruh dunia). Dari membaca diskusi online (dan dalam buku), solusi umum tampaknya memiliki dimensi tanggal dan waktu yang terpisah serta cap waktu di tabel fakta.
Namun, pertanyaan saya mengalami kesulitan menjawab adalah apa gunanya dimensi tanggal dan waktu untuk saya mempertimbangkan persyaratan zona waktu dinamis saya? Dimensi waktu sedikit lebih masuk akal tetapi saya mengalami kesulitan dengan dimensi tanggal. Pendekatan desain umum untuk dimensi tanggal biasanya mencakup properti seperti nama hari, hari minggu, nama bulan, dll. Masalah yang saya alami dengan semua itu adalah bahwa pukul 11:00 pada hari Selasa, 31 Desember 2013 di UTC adalah hari Rabu , 1 Januari 2014 di semua zona waktu setelah UTC + 2.
Jadi jika saya harus melakukan semua konversi zona waktu ini pada setiap kueri (dan laporan) lalu apa gunanya memiliki dan menyimpan properti ini yang mungkin tidak akan pernah saya gunakan (sepertinya)? Beberapa orang menyarankan memiliki baris fakta untuk setiap zona waktu tetapi itu tampak konyol bagi saya. Kita harus dapat menyimpan jutaan catatan setiap bulan.
Yang lain menyarankan memiliki tabel jembatan zona waktu yang walaupun masuk akal, tetapi juga tampaknya lebih rumit dan tambahan untuk mencapai sesuatu yang aplikasi dan laporan klien saya harus dapat dengan mudah mengetahui dari suatu tanggal (pelaporan akan terutama berbasis web di mana ada segudang perpustakaan untuk membantu dalam mengkonversi, menampilkan dan memformat tanggal).
Satu-satunya hal yang dapat saya pikirkan adalah kemudahan dan kemungkinan kinerja pengelompokan berdasarkan tanggal dan jam, tetapi seberapa buruk suatu praktik dikelompokkan berdasarkan datepart (kami menggunakan MS SQL tetapi kami akan meminta jutaan baris) atau harus kami pertimbangkan hanya dimensi tanggal dan waktu yang sangat sederhana dengan angka tidak lebih dari jam, hari, bulan dan tahun untuk sebagian besar karena sebagian besar literal seperti Senin tidak akan berarti banyak ketika zona waktu ikut bermain?
sumber
Jawaban:
Pertama...
Memisahkan
Datime/Time
menjadiDate
dimensi danTime
dimensi pasti cara untuk pergi.Untuk mengelola beberapa zona waktu, Anda harus menduplikasi
DateKey
danTimeKey
agar Anda memiliki yang berikut ini:LocalDateKey
LocalTimeKey
UtcDateKey
UtcTimeKey
Kamu bilang...
Dengan memiliki 4 kolom yang saya daftarkan di atas Anda, akan dapat bergabung dengan tabel fakta ke dimensi Tanggal dan / atau Menggunakan Table Alias (dalam terminologi Kimball tabel-tabel dimensi alias ini dikenal sebagai "Dimensi Bermain Peran"), jadi Anda akan memiliki sesuatu seperti berikut:
Sebagai penutup ...
Saat Anda membangun data mart, dan bukan database OLTP, pembuatan waktu Lokal dan Utc harus dilakukan dalam ETL Anda , BUKAN dalam aplikasi sisi klien karena alasan berikut (selain dari lokalisasi waktu UTC ke perspektif pembaca laporan):
StandardisedDateKey
, atauCorporateHQDateKey
, di mana alih-alih tabel tanggal UTC yang Anda distandarisasi berdasarkan beberapa bisnis lain yang disepakati standarsumber
Date
danTime
bukannya tunggalDateTime
? Tabel fakta mungkin memiliki beberapa tanggal, dan menyimpan dua INT sebagai ganti satu untuk masing-masing dapat ditambahkan.Saya meminta maaf sebelumnya atas singkatnya jawaban ini dan berencana untuk menguraikan ketika saya tidak di tempat kerja.
Tentunya ada keuntungan memiliki tabel tanggal dan waktu karena memungkinkan agregasi data Anda dengan mudah. Dalam banyak kasus, ini adalah cara paling sederhana untuk mengurutkan berdasarkan bulan atau hari kerja hal-hal seperti itu. Namun ini tidak serta merta menggantikan kegunaan cap waktu. Dalam kasus khusus Anda, cap waktu UTC. Setelah Anda memiliki cap waktu itu, yang harus Anda lakukan adalah mengubahnya ke waktu lokal di lapisan laporan atau presentasi. Untuk menghindari pemindaian jangkauan, pastikan Anda juga mengubah rentang permintaan Anda ke waktu UTC.
Jika ada pertanyaan atau komentar lain, jangan ragu untuk bertanya.
sumber