Latar Belakang
Saya seorang siswa CS tahun pertama dan saya bekerja paruh waktu untuk bisnis kecil ayah saya. Saya tidak punya pengalaman dalam pengembangan aplikasi dunia nyata. Saya telah menulis skrip dengan Python, beberapa kursus di C, tapi tidak seperti ini.
Ayah saya memiliki bisnis pelatihan kecil dan saat ini semua kelas dijadwalkan, direkam, dan ditindaklanjuti melalui aplikasi web eksternal. Ada fitur ekspor / "laporan" tetapi sangat umum dan kami membutuhkan laporan spesifik. Kami tidak memiliki akses ke database aktual untuk menjalankan kueri. Saya diminta membuat sistem pelaporan khusus.
Ide saya adalah untuk membuat ekspor CSV generik dan mengimpor (mungkin dengan Python) mereka ke dalam database MySQL yang dihosting di kantor setiap malam, dari mana saya dapat menjalankan permintaan spesifik yang diperlukan. Saya tidak memiliki pengalaman dalam database tetapi memahami dasar-dasarnya. Saya sudah membaca sedikit tentang pembuatan basis data dan formulir normal.
Kami mungkin akan segera memiliki klien internasional, jadi saya ingin database tidak meledak jika / ketika itu terjadi. Kami juga saat ini memiliki beberapa perusahaan besar sebagai klien, dengan divisi yang berbeda (misalnya perusahaan induk ACME, divisi perawatan ACME, divisi perawatan tubuh ACME)
Skema yang saya buat adalah sebagai berikut:
- Dari perspektif klien:
- Klien adalah tabel utama
- Klien terhubung dengan departemen tempat mereka bekerja
- Departemen dapat tersebar di seluruh negara: SDM di London, Pemasaran di Swansea, dll.
- Departemen terkait dengan divisi perusahaan
- Divisi terkait dengan perusahaan induk
- Dari perspektif kelas:
- Sesi adalah tabel utama
- Seorang guru terhubung dengan setiap sesi
- Statusid diberikan untuk setiap sesi. Misalnya 0 - Selesai, 1 - Dibatalkan
- Sesi dikelompokkan menjadi "paket" dengan ukuran sewenang-wenang
- Setiap paket ditugaskan ke klien
- Sesi adalah tabel utama
Saya "mendesain" (lebih seperti mencoret-coret) skema pada selembar kertas, mencoba membuatnya tetap dinormalisasi ke bentuk ke-3. Saya kemudian menancapkannya ke MySQL Workbench dan itu membuat semuanya cantik untuk saya:
( Klik di sini untuk grafik berukuran penuh )
(sumber: maian.org )
Contoh kueri yang akan saya jalankan
- Klien dengan kredit yang masih tersisa tidak aktif (mereka yang tidak memiliki kelas dijadwalkan di masa mendatang)
- Berapa tingkat kehadiran per klien / departemen / divisi (diukur dengan status id di setiap sesi)
- Berapa banyak kelas yang dimiliki seorang guru dalam sebulan
- Tandai klien yang memiliki tingkat kehadiran rendah
- Laporan khusus untuk departemen SDM dengan tingkat kehadiran orang di divisi mereka
Pertanyaan
- Apakah ini overengineered atau saya menuju ke arah yang benar?
- Apakah kebutuhan untuk bergabung dengan beberapa tabel untuk sebagian besar kueri menghasilkan hit kinerja besar?
- Saya telah menambahkan kolom 'lastsession' ke klien, karena itu mungkin akan menjadi permintaan umum. Apakah ini ide yang bagus atau haruskah saya menjaga database tetap normal?
Terima kasih atas waktunya
divisions
memiliki kolom bernama divisionid
. Apakah Anda tidak menemukan itu berlebihan? Sebut saja id
. juga nama tabel Anda termasuk _has_
: saya akan menghapusnya dan beri nama saja misalnya cities_departments
. DATETIME
kolom Anda harus bertipe TIMESTAMP
kecuali nilai input pengguna. Saya pikir itu ide yang baik untuk memiliki cities
dan countries
tabel. Anda mungkin mengalami kesulitan membatasi tabel ke satu status
. pertimbangkan untuk menggunakan INT
dan melakukan perbandingan bitwise di atasnya- sehingga Anda dapat memiliki lebih banyak makna di sana