Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Przechowywanie danych formularzy dynamicznych w DBMS, szukanie optymalnego podejścia

Zetknąłeś się z powszechnym problemem:próba użycia czegoś statycznego (baza danych o predefiniowanej strukturze) do czegoś dynamicznego (kilka pojedynczych zestawów danych, które mają tylko jedną wspólną cechę:pochodzą z formularzy). To, czego chcesz, jest wykonalne z bazami danych, ale byłoby to znacznie łatwiejsze do zrobienia bez, jednak ponieważ zakładam, że naprawdę chcesz użyć do tego bazy danych, oto co bym zrobił:

  • Masz document (lub kwestionariusz ), który zawiera wiele questions . Oba są wystarczająco ogólne i wymagają własnych tabel, tak jak robiłeś to do tej pory.
  • Każde pytanie ma type który określa rodzaj pytania (wybór wielokrotny, dowolny, wybór jednego... ) i oczywiście pytanie ma również options . Więc to dwa stoliki więcej. Rozumowanie tutaj jest takie, że oddzielenie ich od rzeczywistego pytania pozwala na istnienie pewnego poziomu abstrakcji, a Twoje zapytania nadal będą dość proste, chociaż prawdopodobnie dłuuugie.

Tak więc każdy dokument ma 1..n do pytań, każde pytanie ma 1 typ i 1..n opcje. Pomijam trochę, oto co myślę o tabelach linków itp.

Document
    bigint id
DocumentQuestions
    bigint document_id
    bigint question_id
Question
    bigint id
    varchar question
QuestionType
    bigint question_id
    bigint type_id
Type [pre-filled table with id:type pairs, such as 1=freeform, 2=select one etc.]
QuestionOptions
    bigint id
    bigint question_id
    varchar description
    varchar value

Answers
    bigint id
    bigint document_id
    [etc. such as user_id]
QuestionAnswers
    bigint answer_id
    bigint question_id
    bigint questionoptions_id

Ten rodzaj projektu pozwala na kilka rzeczy:

  • Samych pytań można używać wielokrotnie, co jest bardzo przydatne, jeśli tworzysz ogólne „odpowiedz na te x losowe pytania z puli y pytań ".
  • Nowe typy można łatwo dodawać bez naruszania istniejących.
  • Zawsze możesz dość łatwo poruszać się po strukturze, na przykład „Jaka była nazwa dokumentu dla tej jednej odpowiedzi na pytanie, którą mam? " lub "ile osób odpowiedziało niepoprawnie na to jedno pytanie?"
  • Ponieważ typy są rozdzielone, możesz stworzyć (internetowy) interfejs użytkownika, który w łatwy sposób odzwierciedla stan w bazie danych - jeszcze lepiej, jeśli typ się zmieni, możesz nawet nie musieć w ogóle dotykać kodu interfejsu użytkownika.
  • Ponieważ każda możliwa opcja pytania jest osobnym wierszem w QuestionOptions tabeli, możesz bardzo łatwo uzyskać rzeczywistą wartość.

Oczywistym problemem jest to, że wymaga to dość ścisłego połączenia między stołami w celu zachowania spójności i będzie trudne do prawidłowego działania na początku. Również od value w QuestionOptions jest varchar, musisz być w stanie dużo analizować, a nawet możesz wprowadzić inne pole dla wskazówek dotyczących konwersji.

Mam nadzieję, że to pomoże, nawet jeśli w ogóle nie zgodzisz się z moim rozwiązaniem.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Skuteczne monitorowanie MySQL za pomocą pulpitów nawigacyjnych SCUMM:część pierwsza

  2. Jak wywołać procedurę przy każdym połączeniu mysql utworzonym na amazon RDS

  3. MySQL nie używa indeksów (Korzystanie z sortowania plików) podczas korzystania z ORDER BY

  4. SQLSTATE[HY093]:Nieprawidłowy numer parametru:parametr nie został zdefiniowany

  5. Wyeliminuj zduplikowane kolumny w zapytaniu z lewym złączem MySQL