Projekt bazy danych dla ankiety [zamknięty]
Muszę utworzyć ankietę, w której odpowiedzi są przechowywane w bazie danych. Zastanawiam się tylko, jaki byłby najlepszy sposób na zaimplementowanie tego w bazie danych, a konkretnie tabel wymaganych. Ankieta zawiera różne rodzaje pytań. Na przykład: pola tekstowe dla komentarzy, pytań wielokrotnego wyboru i ewentualnie pytań, które mogą zawierać więcej niż jedną odpowiedź (tzn. sprawdzić wszystkie, które mają zastosowanie).
Wymyśliłem dwa możliwe rozwiązania:
-
Stwórz gigantyczny stół który zawiera odpowiedzi dla każdej ankiety Uległość. Każda kolumna będzie odpowiada na odpowiedź z ankieta. tj. SurveyID, Answer1, Answer2, Answer3
Myślę, że to nie jest najlepszy sposób ponieważ jest wiele pytań w tej ankiecie i nie wydaje się bardzo elastyczne, jeśli ankieta ma się zmienić.
-
Inna rzecz, o której myślałem to Tworzenie tabeli pytań i odpowiedzi stolik. Tabela pytań będzie zawiera wszystkie pytania do ankieta. Tabela odpowiedzi zawiera indywidualne odpowiedzi z ankiety, każdy wiersz związany z pytaniem.
Prosty przykład:
TblSurvey : SurveyID
TblQuestion : QuestionID, SurveyID , QuestionType, Question
TblAnswer : AnswerID, UserID, QuestionID , Answer
TblUser : UserID, UserName
Mój problem z tym polega na tym, że tam może być mnóstwo odpowiedzi, które stwórz tabelę odpowiedzi całkiem spory. Nie jestem pewien, czy to jest takie wspaniałe, kiedy to chodzi o występ.
Będę wdzięczny za wszelkie pomysły i sugestie.
11 answers
Myślę, że twój model # 2 jest w porządku, jednak możesz przyjrzeć się bardziej złożonemu modelowi, który przechowuje pytania i gotowe odpowiedzi (oferowane odpowiedzi) i pozwala je ponownie wykorzystać w różnych ankietach.
- Jedna ankieta może mieć wiele pytań; jedno pytanie może być (ponownie) wykorzystane w wielu ankietach.
- Jedna (wstępnie przygotowana) odpowiedź może być udzielona na wiele pytań. Jedno pytanie może zawierać wiele odpowiedzi. Pytanie może mieć różne odpowiedzi oferowane w różnych ankietach. Odpowiedź może być oferowane na różne pytania w różnych ankietach. Istnieje domyślna odpowiedź "Inna", jeśli osoba wybierze inną, jej odpowiedź jest zapisywana w odpowiedzi./ Align = "left" /
- Jedna osoba może wziąć udział w wielu ankietach, jedna osoba może odpowiedzieć na konkretne pytanie w ankiecie tylko raz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-13 18:44:37
Mój projekt jest pokazany poniżej.
Ostatni skrypt create znajduje się w https://gist.github.com/durrantm/1e618164fd4acf91e372
Skrypt i Stół roboczy mysql.plik mwb dostępny jest również w
https://github.com/durrantm/survey
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-05 11:27:37
Zdecydowanie opcja # 2, również myślę, że możesz mieć niedopatrzenie w obecnym schemacie, możesz chcieć innej tabeli:
+-----------+
| tblSurvey |
|-----------|
| SurveyId |
+-----------+
+--------------+
| tblQuestion |
|--------------|
| QuestionID |
| SurveyID |
| QuestionType |
| Question |
+--------------+
+--------------+
| tblAnswer |
|--------------|
| AnswerID |
| QuestionID |
| Answer |
+--------------+
+------------------+
| tblUsersAnswer |
|------------------|
| UserAnswerID |
| AnswerID |
| UserID |
| Response |
+------------------+
+-----------+
| tblUser |
|-----------|
| UserID |
| UserName |
+-----------+
Każde pytanie będzie prawdopodobnie miało określoną liczbę odpowiedzi, z których użytkownik może wybrać, a następnie rzeczywiste odpowiedzi będą śledzone w innej tabeli.
Bazy danych są zaprojektowane do przechowywania wielu danych, a większość z nich jest bardzo dobrze skalowana. Nie ma potrzeby używania mniejszej normalnej formy po prostu, aby zaoszczędzić miejsce.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-19 16:25:15
Ogólnie rzecz biorąc, modyfikowanie schematu w oparciu o coś, co użytkownik może zmienić (np. dodanie pytania do ankiety) powinno być uważane za dość śmierdzące. Są przypadki, w których może to być właściwe, szczególnie w przypadku dużych ilości danych, ale zanim zaczniesz się zanurzać, dowiedz się, w co się pakujesz. Posiadanie tylko tabeli "odpowiedzi" dla każdej ankiety oznacza, że dodawanie lub usuwanie pytań jest potencjalnie bardzo kosztowne i bardzo trudno jest przeprowadzić analizę w pytaniu-agnostic sposób.
Myślę, że twoje drugie podejście jest najlepsze, ale jeśli jesteś pewien, że będziesz miał wiele problemów ze skalą, jedna rzecz, która działała dla mnie w przeszłości, to podejście hybrydowe: {]}
- Utwórz szczegółowe tabele odpowiedzi, aby przechowywać odpowiedzi na pytania, jak opisano w 2. Dane te zazwyczaj nie będą bezpośrednio pobierane z aplikacji, ale będą wykorzystywane do generowania danych podsumowujących dla tabel raportowania. Prawdopodobnie chciałbyś również zaimplementować jakąś formę archiwizacji lub skasowanie tych danych.
- w razie potrzeby utwórz również tabelę odpowiedzi z 1. Może być używany, gdy użytkownicy chcą zobaczyć prostą tabelę wyników.
- W przypadku wszelkich analiz, które należy wykonać w celach raportowania, zaplanuj zadania, aby utworzyć dodatkowe dane podsumowujące na podstawie danych z 1.
Jest to absolutnie dużo więcej pracy do wdrożenia, więc naprawdę nie radziłbym tego, chyba że wiesz na pewno, że ta tabela będzie działać na ogromną skalę obawy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-19 16:16:59
Drugie podejście jest najlepsze.
Jeśli chcesz go jeszcze bardziej znormalizować, możesz utworzyć tabelę dla typów pytań
Proste rzeczy do zrobienia to:
- Umieść bazę danych i zaloguj się na własnym dysku, nie wszystkie NA C jako domyślne
- Utwórz bazę danych tak dużą, Jak to konieczne, aby nie mieć przerw w czasie, gdy baza danych rośnie
Mieliśmy tabele logów w tabeli SQL Server z 10 milionami wierszy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-19 16:25:23
Nr 2 wygląda dobrze.
Dla tabeli z zaledwie 4 kolumnami nie powinno być to problemem, nawet z dobrymi kilkoma milionami wierszy. Oczywiście może to zależeć od tego, jakiej bazy danych używasz. Jeśli to coś takiego jak SQL Server to nie byłoby problemu.
Prawdopodobnie chciałbyś utworzyć indeks w polu QuestionID, w tabeli tblanswer.
Oczywiście musisz określić, jakiej bazy danych używasz, a także szacowane wolumeny.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-09 19:33:56
Wygląda na całkiem kompletną ankietę smiple. Nie zapomnij dodać tabeli "otwartych wartości", w której klient może wyrazić swoją opinię za pomocą pola tekstowego. Połącz tę tabelę za pomocą klucza obcego z odpowiedzią i umieść indeksy we wszystkich kolumnach relacyjnych, aby uzyskać wydajność.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-19 16:10:23
Liczba 2 jest poprawna. Używaj poprawnego projektu do momentu wykrycia problemu z wydajnością. Większość RDBMS nie będzie miała problemu z wąską, ale bardzo długą tabelą.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-19 16:10:37
Posiadanie dużej tabeli odpowiedzi, samo w sobie, nie jest problemem. Dopóki indeksy i ograniczenia są dobrze zdefiniowane, powinno być dobrze. Twój drugi schemat wygląda dobrze.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-19 16:11:35
Biorąc pod uwagę odpowiedni indeks twoje drugie rozwiązanie jest znormalizowane i dobre dla tradycyjnego systemu relacyjnych baz danych.
Nie wiem jak wielki jest ogromny, ale powinien pomieścić bez problemu kilka milionów odpowiedzi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-19 16:11:46
Możesz zapisać cały formularz jako łańcuch JSON.
Nie jestem pewien twoich wymagań, ale takie podejście zadziała w pewnych okolicznościach.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-17 19:47:33