Структура анкеты БД - PullRequest
       2

Структура анкеты БД

2 голосов
/ 15 февраля 2011

Извините, я немного запутался в том, как сделать БД для моей анкеты; Это будет один из тех вопросников, где несколько вопросов выбираются в случайном порядке, отображаются с возможными ответами рядом с ними, где каждый ответ имеет вес, который вычисляется в конце.

Итак, я получил 3 таблицы: вопрос, ответ и вес

Вес имеет один-ко-многим с ответом, потому что каждый ответ будет иметь вес, который будет добавлен к окончательному баллу.

Что меня смутило, так это то, как избавиться от отношения многих ко многим между вопросом и ответом, поскольку на один вопрос будет много возможных ответов, и один и тот же ответ, т.е. да / нет, будет использоваться во многих вопросах.

Ответы [ 3 ]

4 голосов
/ 15 февраля 2011

Я бы рекомендовал следующую структуру:

  • Вопросы
    • имеет 0: n ответов
    • атрибуты: id (int PK), вопрос (текст)
  • Ответы
    • имеет 1 вопрос
    • имеет 0: n ответов
    • атрибуты: id (int PK), answer (text)), идентификатор вопроса (int FK)
  • Ответы
    • имеет 1 ответ
    • (имеет 1 вопрос через ответ)
    • имеет1 респондент (пользователь)
    • атрибуты: идентификатор (int PK), идентификатор ответа (int FK), идентификатор пользователя (int FK)
  • Users
    • имеет 0: n ответов
    • атрибуты: id (int PK) + все, что вам нужно хранить о пользователях

(PK = первичный ключ, FK= внешний ключ)

Хранить weight как атрибут вопроса или ответа.Вы на самом деле не описали, что такое weight, поэтому сложно сказать.


Вот записи по одному вопросу, и кто-то отвечает на этот вопрос.В этом примере Жана Люка Пикара спрашивают: «Сколько огней?»с возможными ответами «3», «4» и «5».Конечно, он выбирает «4», за что не получает weight («5» - правильный ответ).

Question: (QID=1, Question="How many lights?")
Answer: (AID=1, QID=1, Answer="3", Weight=0)
Answer: (AID=2, QID=1, Answer="4", Weight=0)
Answer: (AID=3, QID=1, Answer="5", Weight=1)
Response: (RID=1, AID=2, UID=1)
User: (UID=1, Name="Jean Luc Picard", ...)
1 голос
/ 15 февраля 2011

У вас есть два варианта:

  1. Не избавляйся от многих ко многим. Тебе не больно.

  2. Есть "Ответить на вопрос". Например. В таблице ответов есть столбцы «question_id, answer, weight». (насколько я понимаю, поскольку вес - это ответ / вопрос perl, вам не понадобится отдельная таблица весов). Первичный ключ: "question_id + answer"

    Да, этот второй дизайн не нормализован - вы будете хранить несколько разных копий ответа «да».

    Но это не большая потеря (ссылочная целостность в данном конкретном случае не представляет большой проблемы (например, "сохранять все строки" Да "идентичными), а проблемы с пространством минимальны - большие ответы в любом случае будут уникальными и для маленьких вы не экономите слишком много места, сохраняя идентификатор вопроса «да» и строку «да».

Я рекомендую второй вариант - он проще как для написания кода, так и для обслуживания, и здесь нет больших недостатков, несмотря на теоретическую денормализацию

0 голосов
/ 16 февраля 2011

@ wuputah вес - это количество баллов, которое стоит вопрос, если он выбран.

Я решил использовать таблицу ответов с таким же весом, т.е.weightID *)

С двумя таблицами вопросоввес для многих ответов, один ответ для многих вопросов

...