Saya telah diminta untuk membuat sesuatu yang melacak biaya harian untuk dikumpulkan di akun, dan saya mencoba mencari skema tabel database yang akan mendukung ini.
Inilah yang saya tahu
- Perusahaan memiliki lebih dari 2,5 juta akun
- Dari jumlah tersebut, mereka saat ini bekerja rata-rata 200.000 per bulan (yang berubah dengan tingkat kepegawaian, yang saat ini rendah)
- Mereka memiliki 13 jenis biaya berbeda yang ingin mereka lacak, dan mereka telah memperingatkan bahwa mereka mungkin menambahkan lebih banyak di masa depan
- Mereka ingin biaya dilacak setiap hari
- Biaya tidak dibagi di seluruh inventaris. Entah itu dibagi berdasarkan # akun yang dikerjakan per bulan (200.000), atau pengguna dapat memasukkan pengenal akun untuk menerapkan biaya pada sekelompok akun, atau mereka dapat dengan mudah menentukan akun mana yang akan dikenakan biaya.
Pikiran pertama saya adalah database yang dinormalisasi:
ID Akun Tanggal CostTypeId Jumlah
Masalah saya dengan ini adalah, lakukan matematika. Tabel ini akan menjadi besar dengan cepat. Dengan asumsi semua 13 jenis biaya dapat diterapkan ke semua akun yang bekerja untuk bulan berjalan, itu 200k * 13 * N days in month
adalah sekitar 75-80 juta catatan per bulan, atau hampir satu miliar catatan per tahun.
Pikiran kedua saya adalah sedikit mendenormalisasi itu
ID Akun Tanggal Total biaya Jenis Biaya1 Jenis Biaya2 Jenis Biaya3 Jenis Biaya4 Jenis Biaya5 Jenis Biaya6 Jenis Biaya7 Jenis Biaya8 Jenis Biaya9 Jenis Biaya10 Jenis Biaya11 Jenis Biaya12 Jenis Biaya13
Metode ini lebih didenormalisasi dan dapat membuat hingga 6 juta catatan per bulan ( 200k * N days in month
), atau sekitar 72 juta per tahun. Ini jauh lebih sedikit daripada metode pertama, tetapi jika perusahaan memutuskan Jenis Biaya baru di masa depan, kolom database lain perlu ditambahkan.
Dari dua metode, mana yang Anda sukai? Mengapa? Apakah ada alternatif lain yang dapat Anda pikirkan yang akan menangani ini dengan lebih baik?
Saya paling tertarik untuk melaporkan kinerja, baik laporan musim panas dan detail. Pekerjaan yang akan menyebarkan biaya keluar dari akun akan dijalankan setiap malam ketika tidak ada orang di sekitar. Masalah kedua adalah ukuran basis data. Basis data yang ada sudah hampir 300GB, dan saya percaya ruang pada disk sekitar 500GB.
Basis datanya adalah SQL Server 2005