Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][MySQL] System ocen (szkolnych) - problem
Forum PHP.pl > Forum > Bazy danych > MySQL
PaKoS
Witam,
otóż buduję podserwis dla pewnej witryny szkolnej
w którym każdy będzie mógł po rejestracji zapisywać swoje oceny z poszczególnych przedmiotów.

Przedmioty są zdefiniowane od początku i nie ma możliwości ich usuwanie czy edycji.
Dla każdego użytkownika po rejestracji tworzy się nowa tabela w bazie
w której mamy jak na razie dwie kolumny o nazwach Przedmiot i Oceny.
W kolumnie Przedmiot mamy w poszczególnych wierszach nazwy przedmiotów a w kolumnie Oceny odpowiadające im oceny zapisane tak:
(np.) 1,2,3,5,2,4,6,3,5,2
Mój problem polega na tym, że nie mam pojęcia jak zaprojektować układ tabeli tak, aby można było dowolną ocenę usunąć, zmienić, dodać nową a także obliczyć średnią ocen dla każdego przedmiotu.
Bo nie wiem co można zrobić z polem "1,2,3,5,2,4,6,3,5,2".
Myślałem o tworzeniu osobnych kolumn dla każdej oceny ale jak wtedy kontrolować nazwy tych kolumn i jak je wybierać?
(Oczywiście układ tabeli który podałem jest przykładowy, taki jaki zrobiłem na tą chwilę ale nic z tego zrobić mi się nie udało)

Proszę o porady,
pzdr,
PaKoS
grom57
Cytat(PaKoS @ 2006-03-24 10:12:24)
Mój problem polega na tym, że nie mam pojęcia jak zaprojektować układ tabeli tak, aby można było dowolną ocenę usunąć, zmienić, dodać nową a także obliczyć średnią ocen dla każdego przedmiotu.
Bo nie wiem co można zrobić z polem "1,2,3,5,2,4,6,3,5,2".
Myślałem o tworzeniu osobnych kolumn dla każdej oceny ale jak wtedy kontrolować nazwy tych kolumn i jak je wybierać?
(Oczywiście układ tabeli który podałem jest przykładowy, taki jaki zrobiłem na tą chwilę ale nic z tego zrobić mi się nie udało)

Proszę o porady,
pzdr,
PaKoS

Jeżeli możesz zmieniać strukturę bazy danych to poszukaj informacji na temat relacji:
jeden do wielu
i wiele do wielu.

Jeżeli nie możesz zmieniać struktury bazy danych to poczytaj w manualu o funkcji explode(), która pomoże operować na tych stringach z ocenami.
PaKoS
Na php się znam ale średni jestem w MySQL-u. Znam funkcje explode a takze mam mozliwosc modyfikowania tabel oczywiscie ale tu chodzi mi bardziej o plan, jak mozna by to zrobic, jak zaplanowac te tabele, ta całą strukturę bo tego właśnie nie jestem pewiem.
Nie wiem czy można by tutaj użyć relacji wiele-do-wielu.
Myślałem o ustaleniu z góry ilości ocen bo wtedy oczywiście każda ocena bedzie w innej kolumnie i wsystko ok ale ja niechciałbym ograniczać użytkowników co do ilości wpisywanych ocen.
grom57
Cytat(PaKoS @ 2006-03-24 12:03:50)
Na php się znam ale średni jestem w MySQL-u. Znam funkcje explode a takze mam mozliwosc modyfikowania tabel oczywiscie ale tu chodzi mi bardziej o plan, jak mozna by to zrobic, jak zaplanowac te tabele, ta całą strukturę bo tego właśnie nie jestem pewiem.
Nie wiem czy można by tutaj użyć relacji wiele-do-wielu.

Ja spróbowałbym tak, chociaż nie wiem czy to dobre rozwiązanie.
Tabele:
users (idUsera, nazwisko itp)
przedmioty(idPrzedmiotu, nazwaPrzedmiotu)
Oraz tabele łącząca zawierającą idUsera, idPrzemiotu i ocenę.
I potem możemy z tym robić co chcemy. Znaleźć wszystkie oceny danego użytkownika, oceny z danego przedmiotu, wyliczyć średnią itp.
Chociaż może da się to zrobić prościej.
Ja dopiero poznaję MySQL.
PaKoS
robię, robię i natrafiam na kolejny problem...
układ tabeli w bazie sql jest taki:


aż do 30 wierszy (ocen)
zrobiłem po prostu możliwość dodania do 30 ocen.
pytanie brzmi:
jak dla każdego wiersza stworzyć przycisk DODAJ OCENE (w niżej podanym kodzie to przycisk +) który będzie dodawał ją automatycznie w kolejnej pustej kratce?

Oto mój kod pliku view.php wyświetlającego oceny:
  1. <?php
  2.  
  3. $connection = mysql_connect("HOST", "USER", "HASŁO") 
  4. or die ("Nie można połączyć się z bazą SQL");
  5.  
  6. $db = mysql_select_db("BAZA_DANYCH", $connection) 
  7. or die ("Nie można wybrać bazy SQL");
  8.  
  9. $queries = array(); 
  10. $queries[] = "SELECT Biologia FROM oceny_user1";
  11. $queries[] = "SELECT Biologia FROM oceny_user1";
  12. $queries[] = "SELECT Fizyka FROM oceny_user1";
  13. $queries[] = "SELECT Geografia FROM oceny_user1";
  14. $queries[] = "SELECT Historia FROM oceny_user1";
  15. $queries[] = "SELECT JAngielski FROM oceny_user1";
  16. $queries[] = "SELECT JNiemiecki FROM oceny_user1";
  17. $queries[] = "SELECT JPolski FROM oceny_user1";
  18. $queries[] = "SELECT Matematyka FROM oceny_user1";
  19. $queries[] = "SELECT Religia FROM oceny_user1";
  20. $queries[] = "SELECT WF FROM oceny_user1";
  21. $queries[] = "SELECT WOS FROM oceny_user1";
  22. $queries[] = "SELECT Specjalizacja1 FROM oceny_user1";
  23. $queries[] = "SELECT Specjalizacja2 FROM oceny_user1";
  24. $queries[] = "SELECT Specjalizacja3 FROM oceny_user1";
  25.  
  26. for($i=0; $i<count($queries); $i++){
  27. $result[$i] = mysql_query($queries[$i], $connection)
  28. or die("Nie mogę wykonać zapytania dla tablicy ".$i);
  29. }
  30.  
  31. ?>
  32.  
  33. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  34. "http://www.w3.org/TR/html4/loose.dtd">
  35. <html>
  36. <head>
  37. <title>TwojeOceny&reg;</title>
  38. <meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
  39. <style type="text/css">
  40.  
  41. <!--- STYLE(skróciłem) --->
  42.  
  43. </style>
  44. </head>
  45. <body>
  46. <center><h3>Oceny dla: user1</h3></center>
  47. <table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" align="center">
  48. <tr>
  49. <td>
  50. <table onMouseOver="this.className='tablecursor'" border="1" style="border-collapse: collapse" bordercolor="#000000" align="center" bgcolor="#FFFFFF">
  51. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">Biologia</td></tr>
  52. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">Chemia</td></tr>
  53. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">Fizyka</td></tr>
  54. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">Geografia</td></tr>
  55. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">Historia</td></tr>
  56. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">J. Angielski</td></tr>
  57. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">J. Niemiecki</td></tr>
  58. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">J. Polski</td></tr>
  59. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">Matematyka</td></tr>
  60. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">Religia</td></tr>
  61. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">WF</td></tr>
  62. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">WOS</td></tr>
  63. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">Specjalizacja1</td></tr>
  64. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">Specjalizacja2</td></tr>
  65. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">Specjalizacja3</td></tr>
  66. </table>
  67. </td>
  68. <td>
  69.  
  70. <table onMouseOver="this.className='tablecursor'" border="1" style="border-collapse: collapse" bordercolor="#000000" align="center" bgcolor="#FFFFFF">
  71.  
  72. <?php
  73.  
  74. echo "<tr onMouseOver=\"this.className='overstyle'\" onMouseOut=\"this.className='normalstyle'\">";
  75. while($row00 = mysql_fetch_row($result[0])){
  76. echo '<td>'.$row00[0].'</td>';
  77. }
  78. echo '</tr>';
  79. echo "<tr onMouseOver=\"this.className='overstyle'\" onMouseOut=\"this.className='normalstyle'\">";
  80. while($row01 = mysql_fetch_row($result[1])){
  81. echo '<td>'.$row01[0].'</td>';
  82. }
  83. echo '</tr>';
  84. echo "<tr onMouseOver=\"this.className='overstyle'\" onMouseOut=\"this.className='normalstyle'\">";
  85. while($row02 = mysql_fetch_row($result[2])){
  86. echo '<td>'.$row02[0].'</td>';
  87. }
  88. echo '</tr>';
  89. echo "<tr onMouseOver=\"this.className='overstyle'\" onMouseOut=\"this.className='normalstyle'\">";
  90. while($row03 = mysql_fetch_row($result[3])){
  91. echo '<td>'.$row03[0].'</td>';
  92. }
  93. echo '</tr>';
  94. echo "<tr onMouseOver=\"this.className='overstyle'\" onMouseOut=\"this.className='normalstyle'\">";
  95. while($row04 = mysql_fetch_row($result[4])){
  96. echo '<td>'.$row04[0].'</td>';
  97. }
  98. echo '</tr>';
  99. echo "<tr onMouseOver=\"this.className='overstyle'\" onMouseOut=\"this.className='normalstyle'\">";
  100. while($row05 = mysql_fetch_row($result[5])){
  101. echo '<td>'.$row05[0].'</td>';
  102. }
  103. echo '</tr>';
  104. echo "<tr onMouseOver=\"this.className='overstyle'\" onMouseOut=\"this.className='normalstyle'\">";
  105. while($row06 = mysql_fetch_row($result[6])){
  106. echo '<td>'.$row06[0].'</td>';
  107. }
  108. echo '</tr>';
  109. echo "<tr onMouseOver=\"this.className='overstyle'\" onMouseOut=\"this.className='normalstyle'\">";
  110. while($row07 = mysql_fetch_row($result[7])){
  111. echo '<td>'.$row07[0].'</td>';
  112. }
  113. echo '</tr>';
  114. echo "<tr onMouseOver=\"this.className='overstyle'\" onMouseOut=\"this.className='normalstyle'\">";
  115. while($row08 = mysql_fetch_row($result[8])){
  116. echo '<td>'.$row08[0].'</td>';
  117. }
  118. echo '</tr>';
  119. echo "<tr onMouseOver=\"this.className='overstyle'\" onMouseOut=\"this.className='normalstyle'\">";
  120. while($row09 = mysql_fetch_row($result[9])){
  121. echo '<td>'.$row09[0].'</td>';
  122. }
  123. echo '</tr>';
  124. echo "<tr onMouseOver=\"this.className='overstyle'\" onMouseOut=\"this.className='normalstyle'\">";
  125. while($row10 = mysql_fetch_row($result[10])){
  126. echo '<td>'.$row10[0].'</td>';
  127. }
  128. echo '</tr>';
  129. echo "<tr onMouseOver=\"this.className='overstyle'\" onMouseOut=\"this.className='normalstyle'\">";
  130. while($row11 = mysql_fetch_row($result[11])){
  131. echo '<td>'.$row11[0].'</td>';
  132. }
  133. echo '</tr>';
  134. echo "<tr onMouseOver=\"this.className='overstyle'\" onMouseOut=\"this.className='normalstyle'\">";
  135. while($row12 = mysql_fetch_row($result[12])){
  136. echo '<td>'.$row12[0].'</td>';
  137. }
  138. echo '</tr>';
  139. echo "<tr onMouseOver=\"this.className='overstyle'\" onMouseOut=\"this.className='normalstyle'\">";
  140. while($row13 = mysql_fetch_row($result[13])){
  141. echo '<td>'.$row13[0].'</td>';
  142. }
  143. echo '</tr>';
  144. echo "<tr onMouseOver=\"this.className='overstyle'\" onMouseOut=\"this.className='normalstyle'\">";
  145. while($row14 = mysql_fetch_row($result[14])){
  146. echo '<td>'.$row14[0].'</td>';
  147. }
  148. echo '</tr>';
  149.  
  150. ?>
  151.  
  152. </table>
  153. </td>
  154. <td>
  155. <table onMouseOver="this.className='tablecursor'" border="1" style="border-collapse: collapse" bordercolor="#000000" align="center" bgcolor="#FFFFFF">
  156. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">
  157. +
  158. </td></tr>
  159. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">
  160. +
  161. </td></tr>
  162. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">
  163. +
  164. </td></tr>
  165. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">
  166. +
  167. </td></tr>
  168. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">
  169. +
  170. </td></tr>
  171. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">
  172. +
  173. </td></tr>
  174. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">
  175. +
  176. </td></tr>
  177. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">
  178. +
  179. </td></tr>
  180. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">
  181. +
  182. </td></tr>
  183. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">
  184. +
  185. </td></tr>
  186. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">
  187. +
  188. </td></tr>
  189. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">
  190. +
  191. </td></tr>
  192. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">
  193. +
  194. </td></tr>
  195. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">
  196. +
  197. </td></tr>
  198. <tr><td onMouseOver="this.className='overstyle'" onMouseOut="this.className='normalstyle'">
  199. +
  200. </td></tr>
  201. </table>
  202. </td>
  203. </table>
  204. </body>
  205. </html>
  206.  
  207.  
  208. <?php
  209.  
  210.  
  211. ?>


a Tak to wygląda w przeglądarce:


Bardzo proszę o pomoc,
pzdr,
PaKoS
kanan
Chcialbym wrocic do wczesniejszego watku, a mianowicie ukladu tabeli. Dlaczego unikasz dekompozycji? Wydaje mi sie, ze uklad tabeli mozna by uproscic nadajac odpowiednim przedmiotom i nauczycielom oraz uczniom identyfikatory, a nastepnie za pomoca polaczen tworzyc taka tabele z ocenami. Innymi slowy, widzialbym to tak:

Tabela :
Przedmioty (id_przedmiotu, nazwa_przedmiotu),
Nauczyciele (id_nauczyciela, nazwisko_nauczyiela) // nie wiem, czy ta funkcjalnosc wymaga Twoja baza

Uczniowie (id_ucznia, nazwisko_ucznia, etc.)

Oceny (id_ucznia,id_przedmiotu,id_nauczyciela,ocena);

gdzie id_ucznia jest kluczem obcym na tabele Uczniowie, id_przedmiotu kluczem obcym na tabele Przedmioty, id_nauczyciela kluczem obcym na tabele Nauczyciele.

Spowoduje to, ze nie bedziesz musial tworzyc tabeli ze wszystkimi ocenami dla kazdego ucznia, sprawi to rowniez, wszystkie oceny beda w jednej tabeli, ewentualne zwiekszenia danych ucznia, nauczyciela, przedmiotow nie bedzie sie wiazac z nowa tabela, a tylko dopisaniem nowych kolumn do juz istniejacej. Ponadto nie bedzie obowiazku by zmieniac dla uczniow jednej klasy tabele, bo przeciez raz przedmioty odchodza raz dochodza. Jedynym minusem jaki moze tu sie pojawic to ewentualny koszt operacji bo bedziemy miec do czynienia z polaczeniem, ale nie sadze by mialo to az tak duze znaczenie...
Dafidov
Mam podobny ale nieco bardziej złożony problem.
Pierwsze pytanie: czy moja koncepcja jest słuszna?

Utworzylem tablice index w ktorej mam pola:

id id_student id_rok_akad id_przedmiot id_war_otrz_wpisu status id_ocena wpis

wszystkie id_* to klucze obce odwolujace sie do tablic student itd.

Zastanawiam sie czy moja koncepcja jest sluszna jesli chodzi o specyfikacje listy przedmiotow? Tzn czy w ten sposob majac w tabeli indeks id_przedmiot moge utworzyc dowolna spora liste przedmiotow? Czy lepszym ( i wogole poprawnym) rozwiazaniem bylo by utworzenie tablicy lista przedmiotow ? ( Wydaje mi sie iz nie ale pytam gdzy zbyt wielkiego doswiadczenia w tej materii nie posiadam).

Jezeli moja koncepcja jest sluszna - jak dodawac nowe przedmioty? Chdzi mi o przyklad kodu ktory bedzie jak mi sie wydaj nieco zawily i dlugi ze wzgledu na odwolania do wielu tabel relacyjnych w ktorych przechowywane sa konkretne nazwy przedmiotow ocene warunkow otrzymania wpisow.

Doszedlem poki co do tego iz pozniej jak juz tego dokonam to do wyswietlania takiej listy indeksu dla konkretnego studenta trzeba bedzie skorzystac z funkcji left join i wybierac wspolne pola dla konkretnych id.

Kolejne pytania:

Jeszcze w kwestii indeksu - chyba powinienem tam tez dodac pole id_pracownika?

Trapi mnie jeszcze jedna sprawa - jak utworzyc i gdzie (czy w osobnej tabeli czy w ktorejs istniejacej ) typy zajec ( poniewaz moze to byc wyklad cwiczenia labolatorium itp ), czy dodac to do ineksu? Taka wlasnie mam koncepcje gdyz wowczas tez dzieki left join bede mogl wybierac odpowiednie tabele i pola ale prosze o potwierdzenie lub zaprzeczenie mojej tezie.

Z gory dziekuje za podpowiedz.
kanan
1) przedstaw moze wszystkie tablice, tak bedzie bardziej obrazowo.
2) pytanie nie rozumiem, jak ono sie ma do tematu tego watku?
Dafidov
odp 2)
Ma taki zwiazek ze w bazie ktora tworze jeden z podsystemow to system dodawania ocen i jak osoba tworzaca ten temat tez nie wiem czy prawidlowo tworze sobie taki schemat do dodawania ocen czy nie i ewentualnie chcial bym wiedziec jak nalezy to zrobic dobrze ( przykladowy kod).

odp 1) gdybym chcial wstawic tutaj kod wszystkich tablic to zajal by on z "kilometr", a nie jest to konieczne i tylko zaciemnilo by obraz problemu - chodzi mi o idee jaka i jak baze (tabele) utworzyc aby stworzyc sprawny system dodawania ocen do uzytkownika (ucznia, studenta) przez nauczyciela.
PaKoS
Cytat(kanan @ 2006-03-26 13:59:16)
(...)

Tabela :
Przedmioty (id_przedmiotu, nazwa_przedmiotu),
Nauczyciele (id_nauczyciela, nazwisko_nauczyiela) // nie wiem, czy ta funkcjalnosc wymaga Twoja baza

Uczniowie (id_ucznia, nazwisko_ucznia, etc.)

Oceny (id_ucznia,id_przedmiotu,id_nauczyciela,ocena);

gdzie id_ucznia jest kluczem obcym na tabele Uczniowie, id_przedmiotu kluczem obcym na tabele Przedmioty, id_nauczyciela kluczem obcym na tabele Nauczyciele.

(...)

Chyba się nie całkiem rozumiemy..
w podanym przez ciebie przykładzie będzie JEDNA ocena z przedmiotu (domyślam się że myślałeś iż chodzi mi o ocenę semestralną).
A mi chodzi o to żeby było tych ocen wiele, po prostu tyle ile jest ich w dzienniku (!). Tak więc tu mam naprawdę duży problem związany z układem tabeli.. przecież żeby usuwać lub zmieniać oceny trzeba by każdą z ocen umieścić w osobnej 'ramce' w wierszu tabeli....

pzdr,
PaKoS
Mayger
Cytat(PaKoS @ 2006-04-19 18:39:21)
A mi chodzi o to żeby było tych ocen wiele, po prostu tyle ile jest ich w dzienniku (!)

Jak dla mnie rozwiązanie kanana jest dobre i przecież możesz dodawać po kilka ocen nie tylko jedną dla danego ucznia, więc to rozwiązanie wydaje mi się dobre i nie będziesz miał problemu z dodawaniem "wielu ocen".
PaKoS
A jednak... nadal tego rozwiązania nie rozumiem
Zauważcie że każdy uczeń musi mieć WIELE ocen z 15 przedmiotów (!)
Dla każdego przedmiotu dla jednego ucznia jest wiele ocen (exclamation.gif)
Dafidov
Witam w mojej bazie rozwiazalem to tak jak kanan pisal - tabele relacyjna wiele do wielu.
Ja mam jednak w tej chwili inny klopot zwiazany z tymi tabelami i z tym czy nie tworzyc nowych...
Otóż w moim systemie mam taki problem ze przedmoty jak i oceny i nauczyciele nie zaleza (naleza) tylko do jednego kierunku nauczania anie tylko dla jednego roku.
Chodzi o to ze mamy np. 5 letni tok nauki na kilku kierunkach ( moze tez byc na kilku wydzialach i moga na nich byc te same kierunki) gdzie w kazdym nowym roku akademickim dochodza nowi uczniowie wiec np w roku 2005/2006 mamy rok 1-5 a w kazdym roku po 4 grupy np 11,12,13,14 21,22,23,24 itd 1 cyfra identyfikuje rok. W nastepnym roku akademcikim 2006/2007 dochodzi kolejna taka sama porcja ... Ilosc dnacyh rosnie lawinowo a trzeba to jakos powiazac z pozostalymi danymi ktorymi sa studenci przedmioty nauczyciele i oceny... Problem na piewszy rzut oka sie wydaje moze blaych - ale jak w takiej strukturze uniknac nadmiarownosci i duplikacji dancyh ?
gdzie przypisywac nauczucielowi przedmiot i grupe ? Gdzie przypisywac ucznia do grupy ?

Ja rozwiazalem juz czesc klopotu i utworzylem tabele laczaca mi pracownika z przedmiotem ktora ma taka strukture:
id id_prac id_przed

Pytanie gdzie dodawac grupy - studenci? Czy lepiej stworzyc (dekomponujac) kolejna tabelke laczaca sama grupe i studenta(badz ucznia jak kto woli) ? Czy dodawac id_grupy do tabeli studenta?

Jaki jest Wasz pomysl?

Problemow jest jeszcze wiecej: jak i czy da sie wogole utworzyc tabele taka zeby wczytac z tablicy program_naucznia w ktorej definiuje wszystkie przedmioty ktore maja byc na danym roku oraz w danym roku akademickim i zeby dalo sie ja przypisac pod jednym id - tak aby student mial po tym id latwy dstep do listy wszystkich przedmiotow jakie ma w danym roku.

czy moze lepie wogole nie tworzyc u niego takiego identyfikatora tylko dane te wczytywac za pomoca selecta na zadanie ucznia?
kanan
No tak wlasnie o tym mowimy. Jeden uczen moze miec wiele ocen, dlatego tez mija sie z cele tworzenie ograniczenia liczby ocen do 30. Oczywiscie z punktu widzenia rzeczywistosci 30 ocen rzadko kiedy zdarza sie uzyskac, ale jesli trafi sie wymagajacy nauczyciel to raz, a dwa to jest pewne marnotrastwo miejsca, bo przeciez miejsce na te 30 ocen musi sie gdzies znalezc, przez to kazdy uczen z kazdego przedmiotu bedzie mial zawsze zarezerwowanych 30 miejsc w pamieci (na dysku), a jesli przedmiot jest malo godzinowy i ocen jest co najwyzej 3? Mamy zajete raptem 10%. Aby uniknac takiej sytuacji - zbyt duzej liczby zbednie wolnych rekordow wprowadza sie wlasnie relacje 1 do wiele. Wtedy ocena jest wpisywana jako identyfikator danego ucznia (jesli takowy istnieje).

Co do drugiej odpowiedzi nie jest powiedziane, ze uczen musi miec oceny, a co jesli nie uzyska zadnej, wowczas jest nieklasyfikowany, w tym ukladzie ograniczenie NOT NULL nie jest pozadane.

Jeszcze jedna sprawa, bo przeczytalem wczesniejszego posta od Pakosa. Mianowicie system ten w zaden sposob nie bedzie ograniczony i mozesz dodawac wiele ocen do tabeli oceny, jak ocena jest wystawiana trzeba podac przedmiot, nauczyciela i ucznia, do ktorego nalezy ocena, to wlasnie gwarantuje tabela Oceny, za kazda dodana ocena moze stac inny nauczyciel, inny przedmiot itd. Przykladowo dodajesz ocene 5 dla Jana Kowalskiego z przedmiotu historia, nastepnie mozesz dodac ocene 3 dla Janki Kowalskiej z biologii i za to odpowiada inny nauczyciel. Jednym zdaniem, tabela oceny bedzie zawierala wszystkie oceny z calej szkoly (mozna ewentualnie dzielic to roczniki, ale czy jest sens?) a potem na podstawie operacji polaczenia z pozostalymi tabelami bedzie mogl uzyskac konkretne oceny przypisane do konkretnych przedmiotow itd.
Dafidov
W temacie Jedna tabela czy wiele poruszony jest watek jak lepiej utworzyc baze SongoQ pisze iż jedna tabela jest latwiejsz od wielu gdyz wowczas jest klopot z budowaniem zapytan - wlasnie dlatego w mojej poprzedniej wypowiedzi o to pytalem: czy lepiej tworzyc wiecej tabeli laczacych moje dane czy lepiej skonsolidowac informacje w jednej duzej tabeli kanan - to ze trzeba stworzyc relacyjne dwie tabelki to jest oczywiste i jak juz napisalem tak zrobilem zeby wiazac ucznia nauczyciela przedmiot i oceny. Tylko trzymajac sie wizji tworzenia jednej tabeli z wieksza iloscia kolumn zastanawiam sie czy jednak nie bedzie zbyt duzej niepotrzebnej duplikacji danych stad tez o to pytalem...
popo
korzystanie z jednej wiekszej tabeli ma swoje zalety (prostota zapytan do bazy) jak i wady (duplikacja rekordow bardzo do siebie podobnych)


wady wielu tabel to to, iz przy standartowym korzystaniu z php i baz user musialby czesto przebrnac przez kilka stron z formularzami aby cos dodac wiec dochodzi komplikacja obslugi

zapytania ktore by cos sensownego zwracaly tez byly by bardziej skomplikowane (musialy by odwolywac sie do kilku tabel na raz)

pozbywamy sie jednak duplikowania danych i jesli zadbamy o odpowiednie zabezpieczenia (kontrole zaleznosci pomiedzy tabelami - constraints) i logiczny podzial danych w poszczegolnych tabelach (mozna dopuscic duplikacje danych w niektorych tabelach celem uproszczenia zapytan) to mozna stworzyc calkiem uzyteczny system (bedzie to bardziej skomplikowane zadanie niz z jedna tabela, ale moze sie oplacac)
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.