tło
Jestem studentem pierwszego roku CS i pracuję w niepełnym wymiarze godzin dla małej firmy mojego taty. Nie mam doświadczenia w tworzeniu aplikacji w świecie rzeczywistym. Pisałem skrypty w Pythonie, trochę zajęć w C, ale nic takiego.
Mój tata ma małą firmę szkoleniową i obecnie wszystkie zajęcia są planowane, rejestrowane i monitorowane za pośrednictwem zewnętrznej aplikacji internetowej. Istnieje funkcja eksportu / „raportów”, ale jest bardzo ogólna i potrzebujemy konkretnych raportów. Nie mamy dostępu do faktycznej bazy danych w celu uruchomienia zapytań. Poproszono mnie o skonfigurowanie niestandardowego systemu raportowania.
Moim pomysłem jest tworzenie ogólnych eksportów CSV i importowanie ich (prawdopodobnie za pomocą Pythona) do bazy danych MySQL hostowanej w biurze każdej nocy, skąd mogę uruchamiać potrzebne zapytania. Nie mam doświadczenia w bazach danych, ale rozumiem podstawy. Przeczytałem trochę o tworzeniu baz danych i normalnych formularzach.
Wkrótce możemy zacząć mieć międzynarodowych klientów, więc chcę, aby baza danych nie eksplodowała, jeśli / kiedy tak się stanie. Obecnie mamy również kilka dużych korporacji jako klientów, z różnymi oddziałami (np. Spółka macierzysta ACME, oddział opieki zdrowotnej ACME, oddział opieki nad ACME)
Wymyślony przeze mnie schemat jest następujący:
- Z perspektywy klienta:
- Klienci to główny stół
- Klienci są powiązani z działem, w którym pracują
- Działy mogą być rozrzucone po całym kraju: HR w Londynie, marketing w Swansea itp.
- Działy są powiązane z działem firmy
- Podziały są powiązane ze spółką dominującą
- Z perspektywy klas:
- Sesje to główny stół
- Nauczyciel jest powiązany z każdą sesją
- Statusid jest nadawany każdej sesji. Np. 0 - zakończone, 1 - anulowane
- Sesje są pogrupowane w „paczki” o dowolnym rozmiarze
- Każda paczka jest przypisana do klienta
- Sesje to główny stół
„Zaprojektowałem” (bardziej jak bazgroły) schemat na kawałku papieru, starając się go znormalizować do trzeciej postaci. Następnie podłączyłem go do MySQL Workbench i sprawiło, że wszystko było dla mnie ładne:
( Kliknij tutaj, aby wyświetlić grafikę w pełnym rozmiarze )
(źródło: maian.org )
Przykładowe zapytania, które będę uruchamiał
- Którzy klienci, którzy nadal mają kredyt, są nieaktywni (klienci bez zajęć zaplanowanych w przyszłości)
- Jaki jest wskaźnik frekwencji na klienta / dział / oddział (mierzony identyfikatorem statusu w każdej sesji)
- Ile zajęć miał nauczyciel w ciągu miesiąca
- Zgłoś klientów, którzy mają niski wskaźnik frekwencji
- Raporty niestandardowe dla działów HR ze wskaźnikami obecności osób w ich dziale
Pytania)
- Czy to jest inżynieria, czy kieruję się w dobrym kierunku?
- Czy potrzeba łączenia wielu tabel w przypadku większości zapytań spowoduje duży spadek wydajności?
- Dodałem do klientów kolumnę „ostatnia sesja”, ponieważ prawdopodobnie będzie to typowe zapytanie. Czy to dobry pomysł, czy powinienem ściśle znormalizować bazę danych?
Dziękuję za Twój czas
divisions
ma nazwę kolumny divisionid
. Nie uważasz tego za zbędne? Po prostu to nazwij id
. także nazwy twoich tabel, w tym _has_
: usunę to i po prostu nadam jej nazwę cities_departments
. Twoje DATETIME
kolumny powinny być typu TIMESTAMP
, chyba że są wartości wejściowe użytkownika. Myślę, że dobrym pomysłem jest mieć tabele cities
i countries
. możesz mieć problemy z ograniczeniem tabel do jednego status
. rozważ skorzystanie z niego INT
i dokonaj na nim porównań bitowych - abyś mógł zachować tam więcej znaczenia