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:

  1. 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ć.

  2. 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.

Author: Michael, 2009-11-19

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.

survey_model_02

 101
Author: Damir Sudarevic,
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 Tutaj wpisz opis obrazka

 37
Author: Michael Durrant,
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.

 16
Author: tplaner,
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: {]}

  1. 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.
  2. 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.
  3. 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.

 3
Author: Ryan Brunner,
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.

 1
Author: Shiraz Bhaiji,
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.

 1
Author: kevchadders,
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ść.

 0
Author: Ben,
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ą.

 0
Author: Larry Lustig,
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.

 0
Author: Dave Swersky,
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.

 0
Author: Jorge Córdoba,
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.

 0
Author: mriiiron,
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