Projekt bazy danych ankiet: powiąż odpowiedź z użytkownikiem


12

Robię model koncepcyjny dla bazy danych ankiet.

Celem jest przechowywanie odpowiedzi udzielonych przez użytkowników (będzie to aplikacja na Androida).

Mam trzy podmioty: użytkownika, pytanie i opcję.

Pytanie będzie mieć jedną lub więcej opcji (na przykład: Ilu pracowników masz? 1-40, 40-1000, +1000).

Opcje będą miały tekst (1-40) i wartość (wartość wybrana przez użytkownika).

Użytkownik wybierze jedną (lub więcej) z tych opcji.

Mój projekt koncepcyjny to:

wprowadź opis zdjęcia tutaj

Nie wiem, jak powiązać odpowiedź z użytkownikiem.

Jak mogę przedstawić tę relację?
Czy mam inną jednostkę do reprezentowania wartości opcji?

Ten model przechowuje pytania i gotowe odpowiedzi (oferowane odpowiedzi) i pozwala na ich ponowne użycie w różnych ankietach.

Muszę przedstawić takie pytanie:

wprowadź opis zdjęcia tutaj

To pytanie jest związane z tym: Projekt bazy danych ankiet: pierwsza wersja. Czy są jakieś błędy?


1
Wygląda na to, że będziesz potrzebować kolejnej tabeli do obsługi relacji wiele do wielu między użytkownikami a opcjami.
— OliverAsmus

Odpowiedzi:


7

Musisz rozróżnić możliwe odpowiedzi od wybranych odpowiedzi.

OptionStół musi być dwa stoły. OptionTabela powinna wynosić 1: M do Questioni powinno zawierać możliwych odpowiedzi na to pytanie.

Następnie musisz utworzyć nowy byt skrzyżowania, nazwać go, Selected_Optionktóry znajduje się pomiędzy Usera Option.

Jeśli twoje pytanie daje użytkownikowi możliwość wpisania wartości jako odpowiedzi (tj. „INNE: ...”), wówczas wartość ta zostanie zapisana w Selected_Optiontabeli. W przeciwnym razie wartość wybrana przez użytkownika będzie wartością znalezioną w Option.


EDYTOWAĆ:

W oparciu o wyjaśnienie wymagań PO: To, czego potrzebujesz, nie jest typowym modelem kwestionariusza w następujący sposób:

  • Wszystkie twoje pytania mają takie same zestawy odpowiedzi (kolumny)
  • Niektóre z twoich odpowiedzi (kolumn) są zgrupowane razem.
  • Bloki pytań są pogrupowane razem.

Biorąc migawkę formularza jako przewodnik, podzieliłem elementy formularza na elementy, które kodowałem kolorami:

Przykład formy oznaczonej kolorem

Może to zostać uwzględnione przez następujący logiczny ERD:

Logiczna ERD

Zauważ, że kodowałem kolorami elementy w ERD, aby odpowiadały migawce twojego przykładowego formularza, aby pokazać korelację.

Jednym z założeń tego modelu jest to, że każdy blok ma tylko jeden zestaw quesitonów (tj. Jeden QUESTION_GROUP), który odpowiada lewej kolumnie w bloku. Jest to trochę uproszczenie.


Zaktualizowałem swoje pytanie obrazem typowego pytania ankiety.
— VansFannel

1
@ VansFannel - Zaktualizowałem swoją odpowiedź, aby odzwierciedlić Twoje edytowane pytanie.
— Joel Brown

Dziękuję Ci bardzo! Bardzo mi pomogłeś. Dodałem tutaj swój końcowy projekt: dba.stackexchange.com/questions/16066/… Możesz to sprawdzić, jeśli chcesz.
— VansFannel

Jedno pytanie: co to znaczy „sekwencja” i „wartość”? Nie tyle pracowałem z ERD (przepraszam).
— VansFannel

@ VansFannel - Uwagi o atrybutach w ERD są po prostu nietrywialnymi (lub nieoczywistymi) kolumnami w tabelach. Spodziewam się, że zgadniesz, gdzie umieścić identyfikatory, FK, opisy itp. Bo sequencesugeruję, że będziesz potrzebować / chcieć kontrolować kolejność wyświetlania przedmiotów. Dla valuemam zwrócić uwagę, że wartość wprowadzona przez użytkownika (nie tylko wybór opcji) może być właściwe.
— Joel Brown,

13

Schemat bazy danych ankiety.

To prawdziwy klasyk, robiony przez tysiące. Na początku zawsze wydają się „dość proste”, ale aby być dobrym, w rzeczywistości są dość złożone. Aby to zrobić w Railsach, użyłbym modelu pokazanego na załączonym schemacie. Jestem pewien, że dla niektórych wydaje się to zbyt skomplikowane, ale po zbudowaniu kilku z nich z biegiem lat zdajesz sobie sprawę, że większość decyzji projektowych to bardzo klasyczne wzorce, najlepiej rozwiązane za pomocą dynamicznej elastycznej struktury danych w początek.
Więcej szczegółów poniżej:

wprowadź opis zdjęcia tutaj

Szczegóły tabeli dla tabel kluczy

odpowiedzi

Odpowiedzi tabela jest krytyczna, gdyż oddaje rzeczywiste reakcje przez użytkowników. Zauważysz, że odpowiada na linki do pytań_opcji , a nie pytań . To celowe.

typy_wejściowe

typy_wejściowe to typy pytań. Każde pytanie może być tylko jednego typu, np. Wszystkie numery wybierania radiowego, wszystkie pola tekstowe itp. Użyj dodatkowych pytań, gdy jest (powiedzmy) 5 numerów wybierania radiowego i 1 pole wyboru dla „dołącz?” opcja lub jakaś taka kombinacja. Oznacz dwa pytania w widoku użytkowników jako jedno, ale wewnętrznie masz dwa pytania, jedno dla wybierania radiowego, jedno dla pola wyboru. W tym przypadku pole wyboru będzie miało grupę 1.

grupy_opcji

Option_groups i Option_choices pozwalają budować „wspólne” grupy. Jednym z przykładów może być pytanie dotyczące aplikacji nieruchomości „Ile lat ma nieruchomość?”. Odpowiedzi mogą być pożądane w zakresach: 1-5 6-10 10-25 25-100 100+

Następnie, na przykład, jeśli pojawi się pytanie o przylegający wiek nieruchomości, wówczas ankieta będzie chciała „ponownie wykorzystać” powyższe zakresy, aby wykorzystać tę samą grupę opcji i opcje.

jednostki miary

Jednostki pomiaru są takie, jak się wydaje. Niezależnie od tego, czy są to cale, kubki, piksele, cegły czy cokolwiek innego, możesz zdefiniować to tutaj.

FYI: Mimo że jest to rodzaj ogólny, można na nim utworzyć aplikację, a ten schemat jest dobrze dostosowany do frameworka Ruby On Rails z konwencjami takimi jak „id” dla klucza podstawowego dla każdej tabeli. Również wszystkie relacje są proste one_to_many, bez potrzeby wielu_to_many lub koniecznych przejść przez wiele. Prawdopodobnie dodałbym has_many: throughs i / lub: delegatów, aby łatwo uzyskać takie rzeczy jak nazwa_badania z indywidualnej odpowiedzi bez.multiple.chaining.


Świetny! Dzięki za odpowiedź. Wiele się z tym nauczę. Dziękuję Ci.
— VansFannel

Świetna odpowiedź. Bardzo przydatne, ponieważ walczę teraz z podobnym problemem projektowym. :)
— Dr. Mike

To powinna być wybrana odpowiedź. Bardzo pomocne, dzięki!
— dsignr

@Michael „Zauważysz, że odpowiada na linki do pytań_opcji, a nie pytań. To celowe.” Czy możesz podać dodatkowe wyjaśnienia, dlaczego? :)
— Pak

@Michael Cześć, świetna odpowiedź! Jeśli musiałbyś mieć możliwość dostosowania CSS niektórych pytań na stronie HTML, jak byś to zrobił? Utworzyłem właściwość CssFile w tabeli moich firm, ale muszę być bardziej szczegółowy na poziomie pytania. Dzięki.
— Patrick,

2

Spójrz na ten ogólny pomysł:

wprowadź opis zdjęcia tutaj

(Dla uproszczenia w powyższym modelu uwzględniono tylko najbardziej istotne pola).

Ten model ma następujące cechy:

  • Jedno pytanie można podzielić na wiele ankiet (a jedna ankieta oczywiście może zawierać wiele pytań). SURVEY_QUESTION to tabela „link”, która implementuje tę relację M: N.
  • Kolejność pytań w ankiecie określa SURVEY_QUESTION.QUESTION_NO. Ponieważ {SURVEY_NO, QUESTION_NO} jest (alternatywnym) kluczem oznaczonym U1na powyższym schemacie, żadne dwa pytania nie mogą zajmować tego samego „pola” w tej samej ankiecie. Różne ankiety mogą mieć te same pytania w innej kolejności.
  • Każde pytanie ma szereg możliwych odpowiedzi lub „opcji”. Kolejność wizualna opcji jest określona przez OPTION.OPTION_NO, a ponieważ jest w PK, żadne dwie opcje nie mogą zajmować tego samego „slotu” pod tym samym pytaniem.
  • Różni użytkownicy mogą udzielić różnych odpowiedzi na to samo pytanie (i oczywiście jeden użytkownik może odpowiedzieć na wiele pytań). Ta relacja M: N jest realizowana za pomocą tabeli „link” ODPOWIEDŹ.
  • Użytkownik odpowiada na pytanie, wybierając najwyżej jedną z jego opcji. Jest to zapewnione przez wykluczenie OPTION_NO z PK ODPOWIEDZI. Jeśli chcesz zezwolić użytkownikowi na wybór wielu opcji, włącz opcję OPCJE_O w PK.

W tym modelu danych nie ma niczego, co zmusiłoby użytkownika do udzielenia odpowiedzi na wszystkie pytania - jest to coś, co musisz zrobić na poziomie aplikacji. Niemniej jednak ten model powinien być dobrym początkiem tego, co musisz zrobić ...


Zaktualizowałem swoje pytanie obrazem typowego pytania ankiety.
— VansFannel

1

Będziesz potrzebować kolejnej tabeli do przechowywania odpowiedzi użytkowników.

user_answers
------------
  user_answer_id - unikalny klucz podstawowy
  identyfikator_użytkownika - FK do tabeli użytkowników
  selected_option_id - FK do tabeli opcji
  question_id - FK do tabeli pytań

Jeśli zdecydujesz, że użytkownicy będą mogli wybrać opcję „Inne” jako opcję i wpisać własną wartość, zaleciłbym osobną tabelę:

user_alt_answers
----------------
  user_alt_answer_id - PK
  alt_answer_text - tekst, który użytkownik wprowadził dla opcji „inne”.
  user_answeR_id - FK do tabeli user_answers

Zaktualizowałem swoje pytanie obrazem typowego pytania ankiety.
— VansFannel,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.