Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Lista obecności uczniów na przedmiocie w danej szkole
Forum PHP.pl > Forum > Bazy danych > MySQL
emillo91
Witam. Chcę się zapytać jak mogę rozwiązać problem zapisu id uczniów nieobecnych na zajęciach, do tabeli MySQL. Zarys tabeli przedstawia się tak:
CODE
id_listy | id_przedmiot | id_nieobecne | id_klasa | id_szkola | data_listy

Przedstawiona tabela jest tabelą dzienniczka elektronicznego. Mój problem polega na tym że nie wiem czy powinienem zapisywać wszystkie id nieobecnych uczniów do pola o nazwie "id_nieobecne" a następnie rozdzielać to w PHP pętlą. Chodzi mi o coś takiego:
CODE
id_listy | id_przedmiot | id_nieobecne | id_klasa | id_szkola | data_listy
1 | 3 | 1426 | 6 | 8 | 2017-22-03

gdzie 1426 to osobne id uczniów
Baza dzienniczka elektronicznego będzie bazą dla wielu szkół dlatego chcę tworzyć listy obecności w jednej tabeli i później wybierać obecności po id przedmiotu, id klasy oraz id szkoły. Moim zdaniem takie rozwiązanie jest dobre do momentu aż przyjdzie mi rozdzielać te obecności na każdego z uczniów w danej szkole. Będę wdzięczny za każdą pomoc.
trueblue
A 1426 to id=1426, czy może 14 i 26, a może 1, 4, 2 i 6, a może 142 i 6...?
Odpowiedź mam nadzieję, że sam znajdziesz. Aby tylko to nie było dodawanie przecinków pomiędzy id.

Czy id_szkola i id_klasa są potrzebne jednocześnie w tabeli? Skoro masz id_klasa, to wiesz do jakiej szkoły przynależy.

Datę listy w tym ujęciu zmieniłbym raczej na datę nieobecności.
emillo91
Rozumiem o co Tobie chodzi. Masz rację że później będzie problem z odróżnieniem czy id nieobecności składa się z jednej czy dwóch cyfr. Zastanawiałem się też żeby rozdzielić te id jakimś separatorem ale skoro ma przechowywać id to pole powinno przechwywać wartości int a nie varchar. Chyba pozostanie mi tylko stworzyć tabelę łącznikową tylko nie wiem jak mogłaby wyglądać. Odnośnie pola id szkola to faktycznie jest zbędne. Jutro będę nad tym myślał
Pyton_000
Co do nieobecności to poszedłbym o krok dalej i zostawił tylo:

ID_ucznia
data_nieobecności
ID_przedmiotu

Tylko te 3 kolumny. Zapewniają one minimalne wymagania aby pobrać odpowiednie dane.
emillo91
Niestety Id_Klasa musi zostać gdyż dane listy obecności dla nauczyciela będą później pobierane przy użyciu sesji z id klasy a id przedmiotu będzie pobierane za pomocą metody GET z pola typu select. Załóżmy że jeden nauczyciel uczy kilka klas z tego samego przedmiotu i jeżeli zostanie pobrane id przedmiotu(który jest kategorią) to zostaną wyświetlone wszystkie listy obecności z przedmiotu np. matematyka, niezależnie od klasy i nauczyciel nie będzie wiedział do której klasy przypisana jest dana lista obecności. Żeby doprecyzować filtrowanie dorzucam do tego zmienną sesyjną z Id_Klasa która wyświetla tylko i wyłącznie listę wybranej klasy z przedmiotu matematyka. Chcę utworzyć sesję klasy ze względu na to że nauczyciel będzie się poruszał pomiędzy zakładkami(tzn. będzie mógł dodawać, usuwać ucznia o ile jest wychowawcą itd nie wybierając za każdym razem klasy w której uczeń jest zapisany). stworzyłem coś takiego:
Lista tabel
Najpierw będzie pobierana lista wszystkich klas których uczy nauczyciel. Następnie zostanie utworzona zmienna sesyjna z id danej klasy natomiast później nauczyciel będzie wybierał istniejącą już listę obecności bądź tworzył nową listę dla klasy ze zmiennej sesyjnej i przedmiotu o id ze zmiennej GET. Taka struktura powinna ułatwić mi później pobieranie nieobecności dla danego ucznia. Co wy na to?
Jeżeli będzie trzeba to podrzucę screeny widoków przyszłej strony które zobrazują o co mi chodzi
trueblue
Uczeń należy do jednej klasy, więc jeśli masz id ucznia, to wiesz jakie jest id klasy.
Pyton_000
@trueblue tak też załżyłem, ale czytając to co autor napisał to chyba nie koniecznie.
trueblue
Pyton_000,
ja się opieram na tym stwierdzeniu autora "nauczyciel nie będzie wiedział do której klasy przypisana jest dana lista obecności.". Skoro mam id_ucznia w liście obecności, to wiem jaka to klasa.
Ale być może czegoś nie rozumiem, bo przyznam, że opis dla mnie jest chaotyczny.
Pyton_000
Chociaż trzeba by było wziąć pod uwagę że uczeń należał do klasy 1-4 a teraz jest w 5 smile.gif Ale to się da załatwić podając rok ew. oznaczać klasy jako nie aktywne
markonix
Można rozdzielić osobę i ucznia na wyższym poziomie.
Czyli tablica z osobami gdzie będą stałe dane dotyczące osoby (imię, nazwisko, data urodzenia) i potem uczniami (numer w dzienniku, id klasy).
Na taki sam problem trafiłem dawno gdy robiłem bazę pod zawodników, błędnie zacząłem używać user_id i dopiero potem rozdzieliłem to na zawodnika i usera.
emillo91
Mi chodzi o sytuację kiedy na konto jest zalogowany nauczyciel. Jak skrypt ma pobrać poprzednie listy obecności danej klasy nie wiedząc którzy uczniowie są przydzieleni do danej klasy?. Odnośnie screenów to chodzi mi o coś takiego:
Na początku nauczyciel wybiera klasę powiedzmy 2Lp (czyli musi ustawić id klasy do zmiennej sesyjnej):
link1
Następnie przechodzi do zakładki "Listy obecności" i tam, po wybraniu przedmiotu matematyka(nauczyciel może uczyć też innych przedmiotów) wyświetla się zbiór list obecności dla klasy 2Lp:
link2
Następnie może utworzyć nową listę obecności dla tej klasy z przedmiotu matematyka bądź wyświetlić już istniejącą listę:
link3

To co piszecie odbieram tak że nauczyciel(nie wychowawca) musiałby wyświetlać zbiór list obecności poprzez sprawdzenie id ucznia a następnie wybranie id klasy. Nie za bardzo rozumiem o co chodzi.
Pyton_000
Nie.

Nie ważne kim jesteś. Jeśli wybierasz klasę to masz `id_klasy`. A skoro już wiesz jaką klasę masz to możesz na tej podstawie pobrać listę uczniów. Skoro masz listę uczniów to wybierając datę listy i przedmiot masz gotowe dane


Taki przykład nieobecnosci na podstawie klasy:
Kod
SELECT nieobecnosci.*
FROM klasa
JOIN uczniowie_klasa ON(uczniowie_klasa.klasa_id = klasa.id)
JOIN uczniowie ON(uczniowie.id = uczniowie_klasa.uczen_id)
LEFT JOIN nieobecnosci ON(nieobecnosci.uczen_id = uczen.id)
WHERE id_klasy = 5;


emillo91
Już rozumiem. Chodzi o to żeby pobierać dane o klasie z rekordu zarejestrowanego ucznia. Ja miałem inny zamysł. Chciałem przypisywać ucznia do klasy a nie klasę do ucznia ale nie wiem czy może być jakaś różnica(w sensie działania) między tymi rozwiązaniami(czy będzie więcej joinów dla mojego rozwiązania). Pyton_000 na podstawie Twojego zapytania zrobiłem takie tabele:
link
I teraz mogę sprawdzać warunkiem czy id wybranego ucznia znajduje się w nieobecnościach.
Tylko będę miał jeszcze jeden problem który po tym nastąpi. Jak zliczyć ilość lekcji które się odbyły żeby dla każdej lekcji skrypt sprawdzał czy uczeń był na zajęciach czy nie(np. 7 lekcji to 7 iteracji dla jednego ucznia)?
Chciałem to rozwiązać pobierając wszystkie zapisane listy obecności z tabeli "ListyObecnosci" i wtedy wiedziałbym ile lekcji(na podstawie list obecności) się już odbyło.
Pilsener
Punktem wyjścia i sercem modelu powinna być tabela "zajęcia", która zawiera coś w rodzaju:
- datę zajęć
- kto prowadzi (imię/nazwisko)
- relację do listy uczestników/uczniów (oddzielna tabela z jakiś polem typu boolean isPresent i oczywiście imię/nazwisko ucznia)
- dane klasy (np. nazwa XIII B )
- dane przedmiotu (np. pauperyzacja w społeczeństwie)

Do tego panel administracyjny gdzie definiujemy wszystko co niezbędne do zapełnienia tabeli "zajęcia"
- tabelę użytkowników
- tabelę klas
- tabelę przedmiotów
- tabelę uczniów (id użytkownika + id klasy)
- tabelę nauczycieli
- itd.

Trzeba pamiętać o historycznym aspekcie danych.
Można np. zastąpić imię/nazwisko user_id jeśli założymy, że tabela users jest immutable i np. wyrzucenie ucznia ze szkoły nie będzie skutkowało jego usunięciem z tej tabeli. Inaczej ktoś chciałby zobaczyć zajęcia id=1 sprzed roku i mógłby się zdziwić, że np. belfer jest inny Lkingsmiley.png Nauczyciele, rodzaje zajęć, liczba klas - to wszystko zmienia się w czasie i należy to uwzględnić.
emillo91
Odnośnie archiwizacji danych to niektóre rekordy musiałyby być duplikowane w pewnych przypadkach. Jeżeli uczeń zmieniałby klasę to musiałby otrzymywać nowe id a stare zostałoby dla innych tabel ale to wiąże się z redundancją rekordów(bo dane ucznia ze starego rekordu tez muszą zostać zapisane). Ewentualnie można utworzyć tabelę "zmiany_danych" w której uwzględni się stare id ucznia a id dodanego rekordu przypisze się do pozostałych tabel. Jeżeli chodzi o temat listy obecności uczniów to uznam go za rozwiązany. Podany przeze mnie powyżej wzór tabeli spełnia moje wymagania. Jeżeli chodzi o temat archiwizacji to będę kombinował a jeżeli nie będę czegoś wiedział to poproszę o pomoc.
Edit:
Odnośnie archiwizacji danych to natknąłem się na takie coś jak tiggery(wyzwalacze) wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.