![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 5.04.2011 Ostrzeżenie: (0%) ![]() ![]() |
Witam Was, mam do Was pytanie jak do speców, chce zrobić jakąś bazę testów online.
Testy już działały bo zapis odbywał się do plików .txt gdzie ich struktura była następująca: /nazwa testu --/nazwa testu/info.ini //informacje o ilości pytań zamkniętych i otwartych oraz o ilości dopuszczalnych odpowiedzi --//nazwa testu/1.txt // pytanie 1 oraz kolejne linijki z odpowiedziami --//nazwa testu/2.txt // pytanie 2 oraz kolejne linijki z odpowiedziami ... --//nazwa testu/xx.txt // pytanie xx oraz kolejne linijki z odpowiedziami Rozwiązywanie było dobre ale dla jednorazowego uruchomienia, zapis wyników też odbywałby się do plików txt ale tutaj poszedłem po rozum do głowy i stwierdziłem że przesiądę się na MySQL i teraz jest problem: Jaką strukturę bazy danych zrobić, tak aby baza działa w miarę wydajnie i bezproblemowo przy 10 jak i przy 200 testach zapisanych w niej. Zastanawia mnie taka struktura: Tabela user | userid | login | haslo | Tabela testy | testid | nr testu | nazwa testu | ilosc pytan | ilosc odpowiedzi | Tabela odpowiedzi | odpid |odpowiedz | nr odpowiedzi | nazwa testu | poprawna | Tabela wyniki | wynikid | login | nazwa testu | Zastanawia mnie czy takie rozwiązanie ma jakiś sens, może ktoś już pisał jakiś test na bazie pytań, gdzie nie ma określonych na sztywno ilości pytań i odpowiedzi? Mam nadzieje ze jakoś zrozumiale opisałem moją sprawę, liczę na propozycję a nie na lincz z Waszej strony;) Chcę poznać Wasze wizję a nie dostać gotowca;) Pozdrawiam JR Ten post edytował perszing2045 19.04.2011, 20:47:05 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 156 Pomógł: 11 Dołączył: 25.12.2005 Ostrzeżenie: (0%) ![]() ![]() |
jezeli dobrze rozumiem, to ja to widze tak
Ten post edytował bercow 19.04.2011, 22:17:46 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 5.04.2011 Ostrzeżenie: (0%) ![]() ![]() |
bercow Dzięki za odpowiedz, jednak widzisz, Twój skrypt przewiduje tylko 4 odpowiedzi na sztywno, a ja myślę żeby samemu ustalać liczbę odpowiedzi do każdego testu (np test1: 20 pytań po 6 odpowiedzi, test2: 10 pytań po 8 odp -> oczywiście nie wiem ile będzie max odpowiedzi:/ ) i tutaj jest problem:/
A może rzeczywiście czas iść z prądem i tworzyć jedynie 4 odpowiedzi do każdego pytania a nie stwarzać sobie problemy:/ Pozdrawiam Ten post edytował perszing2045 20.04.2011, 06:36:34 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 49 Pomógł: 18 Dołączył: 7.04.2011 Skąd: Toruń Ostrzeżenie: (0%) ![]() ![]() |
zamiast
stwórz 2 tabele
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 282 Pomógł: 89 Dołączył: 12.04.2011 Ostrzeżenie: (0%) ![]() ![]() |
Bardziej naturalne wydaje się oddzielenie pytań i odpowiedzi w osobnych tabelach.
Bo jeśli testy mają zmienną liczbę pytań, a każde pytanie może mieć dowolną liczbę odpowiedzi, przy czym dane pytanie występuje tylko w jednym teście, a pytania mogą być trudniejsze i łatwiejsze ( różna ilość punktów ), to nasuwa się struktura: testy: id, nazwa, czas_trwania pytania: id, id_testu, tresc, typ, ilosc_punktow odpowiedzi: id, id_pytania, odpowiedz, prawidlowa Nie jest to jakaś bardzo skomplikowana struktura, a nie ogranicza nam funkcjonalności. Pytania mogą być różnego typu, na przykład jednokrotnego wyboru - wtedy wyświetlamy selecta lub radio, albo wielokrotnego - checkboxy. Sama ilość pytań czy odpowiedzi dla testu wynika bezpośrednio z zawartości w bazie, nie trzeba tego dodatkowo zapisywać w tabeli testy, zwłaszcza że wymagałoby to zmiany za każdym razem gdybyśmy dodawali lub usuwali pytanie lub odpowiedź. Czasami warto mieć takie wartości zapisane po to by było wydajniej, ale w tym przypadku zysk będzie za mały by robić sobie dodatkowe problemy z utrzymaniem spójności bazy. Mysql dobrze sobie radzi z bazami, w których pojedyncze tabele dostają kilkadziesiąt tysięcy nowych rekordów dziennie, przy bazie, w której jest 200 testów po kilkanaście pytań i odpowiedzi to naprawdę nie trzeba się zbytnio martwić wydajnością. Ogólnie trzymając się zasady dla każdej tabeli id typu int, auto_increment, bez null jako klucz primary, plus ewentualnie indeksy na pola wykorzystywane w porównaniach, nawet bardzo skomplikowane zapytania łączące kilka tabel będą natychmiastowe przy tej ilości rekordów jeśli tylko sprzętu nie wzięliśmy z muzeum. Co do użytkowników i wyników to jest ok, pod warunkiem, że wyniki liczymy na bieżąco i nie interesują nas informacje które dokładnie odpowiedzi użytkownik w danym teście zaznaczył. Polecam jednak odnosić się w wynikach przez id testu a nie jego nazwę. Jeżeli chcemy zmienić nazwę testu to najlepiej by to było w jednym właściwym miejscu, co by nie martwić się czy zmieniliśmy już wszędzie czy też może gdzieś coś zostało. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 5.04.2011 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki Koledzy za pomoc, temat stał się bardziej jasny dla mnie jako dla raczkującego w temacie MySQL.
Oczywiście jeżeli inni mają jakąś propozycję rozwiązania to z chęcią poczytam;) Pozdrawiam |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 156 Pomógł: 11 Dołączył: 25.12.2005 Ostrzeżenie: (0%) ![]() ![]() |
te zaznaczone przez usera odpowiedzi, tez nie są głupie, umożliwiają podsumowanie, sprawdzenie błędów, i mogą zapobiegać oszustwom.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 05:05 |