Schemat bazy dla pewnego problemu

0

Hej,
mam pewien problem do rozwiazania jeśli chodzi o włąściwą strukturę danych i proszę o pomoc aby to miało ręce i nogi.

Ogólnie rzecz biorąc chodzi o system który służy do prowadzenia różnego rodzaju szkoleń dla pracowników różnych firm.
Szkolenia są płatne, czasami za szkolenia płaci pracodawca, czasami płaci pracownik.
Jeśli płaci pracownik to ogólnie nie ma problemu bo mam to rozkminione jak poniżej. Zastanawiam się tylko jak nie zrobić jakiegoś potworka z tabelami aby łatwo było obsłużyć kejs gdzie za zajecia płaci pracodawca.
Strukturę mam taką jak poniżej:

course_tab
------------------
course_id: serial (PK)
name: varchar
paysource: varchar - albo STUDENT albo EMPLOYER
course_schedule_tab
-------------------
course_schedule_id: serial (PK)
course_id: int
date: date
student_tab
------------------
student_id: serial
lastname: varchar
firstname: varchar
course_participant_tab
----------------------
course_participant_id: serial
course_id: int
student_id: int

no i teraz załóżmy, że każda lekcja kosztuje 50 zł czyli miałbym coś w stylu:

course_payment_tab
-----------------------
course_payment_id: serial
student_id: int
amount: bigdecimal
due_date: date
income_tab (wplaty)
------------------
income_id: serial
student_id: int
amount: bigdecimal
date: date

Szukam teraz jakiegoś optymalnego sposobu który mi powie że na dzień xxx za zajęcia trzeba zapłacić x zł (dane z course_payment_tab generowane są z góry podczas zapisu)
Jeśli chodzi o to, że płaci pracownik / student to po prostu zliczam sobie ile wpłacił i ile ma do zapłaty na dany dzień i porównuje.
Nie wiem jak do tematu podejść jeśli za studentów / pracowników płaci pracodawca bo:

  1. może być albo sytuacja że opłaci za każdego osobno - wtedy pewnie miałbym sume wszystkich uczestnikow szkolenia i musiałbym zmienić tez tabelę income_tab aby supportowała wpłaty od pracodawcy a nie od studenta
  2. ryczałtowa kwota - xxx zł niezależnie od liczby uczestników - w takiej sytuacji course_payment_tab nie ma sensu z rozbiciem na każdego studenta osobno.

Dzięki za "świeże" spojrzenie na problem.

1

GROUP BY + SUM()?

0

Po pierwsze tabela "course_tab", kolumna paysource - zamiast varchar zrób własny typ ENUM, niby nic, ale np. przy dziesiątkach tysięcy rekordów to już spora oszczędność miejsca, bo enum zajmie Ci 4 bajty, a tekst STUDENT więcej.

Po drugie: dlaczego w course_payment_tab nie masz klucza obcego do "course_schedule_tab"? Chyba dobrze wiedzieć za co jest dana płatność? Chcesz opierać się tylko na dacie? Co w sytuacji kiedy masz dwa kursy w tym samym dniu? Nie mówiąc już o jakimś określaniu godzin OD - DO.

Podobnie w income_tab - nie wiadomo za co jest płatność, chyba powinien klucz obcy do "course_payment_tab"?

Generalnie rozbijanie tego na dwie tabele "course_payment_tab" i "income_tab" nie ma sensu lepiej zrobić taką tabelę:

course_payment
---------------------
id: serial (PK)
course_schedule_tab_id - klucz obcy do kursu za jaki płacimy (w course_schedule_tab_id mamy już datę)
student_id - klucz obcy do studenta
amount - ile do zapłacenia (brutto?)
paid - boolean (true - zapłacone, false - nie zapłacone)
paid_by - ENUM ('student', 'employer') - przez kogo zapłacone: studenta samodzielnie czy pracodwacę

Po trzecie jeżeli masz kolumnę serial to zawsze powinna nazywać się "id" w każdej tabeli. Dopiero klucze obce to kombinacja "nazwa tabeli do której jest klucz obcy" + id - wszystko staje się bardziej przejrzyste.

Co do ryczałtu to po prostu dajesz wszystkim studentom tą samą kwotę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1