Arka fon
İlk sınıf CS öğrencisiyim ve babamın küçük işletmeleri için yarı zamanlı çalışıyorum. Gerçek dünya uygulama geliştirme konusunda deneyimim yok. Python'da senaryolar yazdım, C'de bazı dersler yazdım, ama böyle bir şey yok.
Babamın küçük bir eğitim işi var ve şu anda tüm sınıflar harici bir web uygulaması aracılığıyla planlanıyor, kaydediliyor ve takip ediliyor. Bir dışa aktarma / "raporlar" özelliği var, ancak çok genel ve belirli raporlara ihtiyacımız var. Sorguları çalıştırmak için gerçek veritabanına erişimimiz yok. Benden özel bir raporlama sistemi kurmam istendi.
Benim fikrim jenerik CSV ihracat oluşturmak ve (muhtemelen Python ile) onları her gece ofiste barındırılan bir MySQL veritabanı içine almak, nerede gerekli belirli sorguları çalıştırabilirsiniz. Veritabanlarında deneyimim yok ama temelleri anlıyorum. Veritabanı oluşturma ve normal formlar hakkında biraz okudum.
Yakında uluslararası müşterilere sahip olmaya başlayabiliriz, bu yüzden eğer olursa / veritabanının patlamamasını istiyorum. Şu anda müşteri olarak farklı bölümlere sahip birkaç büyük şirketimiz var (örn. ACME ana şirketi, ACME sağlık bölümü, ACME vücut bakımı bölümü)
Ortaya koyduğum şema şudur:
- Müşteri açısından:
- Müşteriler ana tablodur
- Müşteriler çalıştıkları bölümle bağlantılıdır
- Departmanlar bir ülkeye dağılabilir: Londra'da İK, Swansea'da Pazarlama vb.
- Bölümler bir şirketin bölümüyle bağlantılıdır
- Bölümler ana şirkete bağlıdır
- Sınıflar açısından:
- Oturumlar ana tablodur
- Her oturuma bir öğretmen bağlanır
- Her oturuma bir statusid verilir. Ör 0 - Tamamlandı, 1 - İptal Edildi
- Oturumlar isteğe bağlı boyutta "paketler" halinde gruplanır
- Her paketler bir istemciye atanır
- Oturumlar ana tablodur
Şemayı bir kağıda "daha çok karalanmış gibi" tasarladım ve 3. forma normalleştirmeye çalıştım. Daha sonra MySQL Workbench'e bağladım ve hepsini benim için güzelleştirdi:
( Tam boyutlu grafik için buraya tıklayın )
(kaynak: maian.org )
Çalıştıracağım örnek sorgular
- Hala kredisi olan müşteriler etkin değil (gelecekte planlanan bir sınıfı olmayanlar)
- Müşteri / departman / bölüm başına katılım oranı nedir (her oturumdaki durum kimliği ile ölçülür)
- Bir öğretmen bir ayda kaç ders aldı
- Katılım oranı düşük olan müşterileri işaretleyin
- Bölümlerine katılanların katılım oranlarına sahip İK departmanları için özel raporlar
Soru (lar)
- Bu aşırı mı yoksa doğru yola mı çıkıyorum?
- Çoğu sorgu için birden fazla tabloya katılma ihtiyacı büyük bir performans isabeti ile sonuçlanacak mı?
- Muhtemelen ortak bir sorgu olacak gibi istemcilere bir 'lastsession' sütun ekledim. Bu iyi bir fikir mi yoksa veritabanını kesinlikle normalleştirmeli miyim?
Zaman ayırdığınız için teşekkürler
divisions
adlı sütun var divisionid
. Gereksiz bulamıyor musun? Sadece adlandırın id
. Ayrıca tablo adlarını içeren _has_
: i kaldırmak ve sadece örneğin adını cities_departments
. senin DATETIME
sütunlar tür olmalıdır TIMESTAMP
onlar kullanıcı girişi değerlerini başka. Sanırım cities
ve countries
tabloları olması iyi bir fikir . tabloları tek bir sayıyla sınırlamakta zorlanabilirsiniz status
. kullanmayı düşünün INT
ve üzerinde bitsel karşılaştırmalar yapın, böylece orada daha fazla anlam tutabilirsiniz