Kunci asing tabel fakta null?

9

Saya baru mengenal desain data mart dan perlu menghapus beberapa konsep.

Saya telah membaca sedikit tentang pemodelan dimensi di mana saya melihat bahwa tabel fakta menyimpan referensi kunci asing ke tabel dimensi.

Sekarang anggaplah saya memiliki tabel dimensi phonenumber dan tabel dimensi phone_extension. (Tabel ini memiliki detail berbeda sehingga saya tidak bisa menggabungkannya)

Seperti yang saya pahami kedua tabel dimensi ini akan memiliki kunci primer integer untuk kinerja yang lebih baik, dan tabel fakta akan memiliki kunci primer integer sendiri dan juga menyimpan referensi kunci asing ke tabel dimensi ini.

Tetapi misalkan saya memiliki situasi bahwa tidak semua nomor telepon memiliki phone_extension yang terkait dengannya. (beberapa nomor telepon tidak perlu memiliki ekstensi)

Untuk nomor telepon yang memiliki ekstensi, tabel fakta akan memiliki referensi kunci asing untuk kedua tabel dimensi, tetapi bagaimana cara menangkap situasi di mana hanya ada nomor telepon dan tidak ada ekstensi untuk mereka (dan sebaliknya yaitu ekstensi tanpa phonenumber) ?

Haruskah saya menangkap informasi tersebut dengan nomor telepon FK di tabel fakta yang memiliki nilai dan phone_extension kunci asing nol ?? Atau objek tidak terkait seperti itu tidak direkam dalam tabel fakta?

Saya juga perlu membuat laporan data mart ini. Jadi, apakah saya mulai dengan menanyakan tabel fakta dan mengambil nilai kunci dimensi atau melaporkan langsung dari tabel dimensi?

Terima kasih atas waktu Anda membaca ini !!
Hargai bantuan apa pun !!

akotian
sumber
mungkin pertanyaan serverfault?

Jawaban:

10

Anda dapat meninggalkan FK ke beberapa tabel dimensi sebagai NULL jika dimensi tersebut tidak diketahui atau tidak berlaku. Anda hanya perlu ingat untuk menggunakan gabungan luar ketika Anda melakukan kueri pelaporan Anda.

Atau, beberapa orang membuat catatan dimensi "tidak ada" dan / atau "n / a" untuk dimensi data mart dan kemudian mengisi tabel fakta FK untuk menunjuk pada ini daripada menggunakan NULLs. Orang yang melakukan ini menyukai pendekatan ini karena mereka tidak menyukai penggabungan luar.

Orang-orang yang menggunakan NULL FK pada tabel fakta biasanya memiliki keengganan untuk orang-orang yang memiliki versi untuk bergabung luar. ;) (dengan kata lain, ini adalah masalah gaya yang dapat menghasilkan perang agama)

Saya katakan lakukan mana yang Anda suka, tetapi pilih satu pendekatan dan berpegang teguh pada itu.

Joel Brown
sumber
10

Jangan letakkan nulls di Warehouse atau di Marts.

Gudang harus dinormalisasi dengan baik (setidaknya BCNF) dan karena itu harus mengecualikan nol. Nulls dapat disimpan dalam tabel pementasan jika mereka ada di sumber data tetapi mereka tidak diperlukan di dalam gudang itu sendiri.

Mart harus dirancang untuk mendukung alat presentasi dan permintaan pengguna. Nulls hanya menghalangi hal-hal itu karena mereka tidak pernah ditampilkan dan mereka membuat permintaan pengguna lebih kompleks dan rawan kesalahan - terutama di kolom kunci asing yang sering menjadi subjek untuk bergabung.

nvogel
sumber
Saya setuju, tetapi untuk alasan yang dikutip oleh Brown: sangat berharga memiliki catatan sintetis eksplisit untuk alasan lapangan jika tidak akan NULL. NULL tidak memberi tahu pengguna apa pun kepada pengguna; "Nilai tidak dapat diuraikan", "Kolom dibiarkan kosong", atau "Belum ada eksekutif akun yang ditugaskan" berguna.
Jon of All Trades
0

kunci dimensi dalam fakta tidak boleh nol dan saya juga memiliki dimensi untuk menghilangkan kebutuhan untuk penggabungan luar kiri oleh pengguna akhir, laporan dll. Semua banyak fakta harus melakukan penggabungan kiri luar dengan dimensi dan default ke kunci 0 tidak ada kunci sama sekali dan gagal. Lebih baik gagal daripada bergabung dengan dimensi dan tidak tahu Anda melewatkan baris pada kenyataannya, sampai beberapa pengguna akhirnya menemukannya (jika itu pernah terjadi)

buat catatan "n / a" dalam dimensi phone_extension dan tautkan ke sana.

aturan saya adalah satu-satunya nilai nullable dalam datamart akhir dwh adalah fakta itu sendiri, sehingga fungsi agregat seperti avg masih berfungsi.

Ab Bennett
sumber