Дизайн базы данных - вопрос взаимосвязи таблиц - PullRequest
0 голосов
/ 19 мая 2010

Я разрабатываю схему для простого приложения викторины. Имеет 2 таблицы - «Вопрос» и «Выбор ответа». Стол вопросов имеет столбцы «идентификатор вопроса», «текст вопроса» и «идентификатор ответа». Таблица «Варианты ответов» содержит столбцы «идентификатор вопроса», «идентификатор ответа» и «текст ответа». С этой простой схемой очевидно, что вопрос может иметь несколько вариантов ответа и, следовательно, необходимость таблицы ответов. Тем не менее, вопрос может иметь только один правильный ответ и, следовательно, необходимость в «идентификаторе ответа» в таблице вопросов. Однако этот столбец «Идентификатор ответа» в таблице вопросов создает иллюзию, как будто может быть несколько вопросов для одного ответа, который не является правильным. Другой альтернативой для устранения этой иллюзии является наличие другой таблицы только для правильного ответа, которая будет иметь всего 2 столбца, а именно идентификатор вопроса и идентификатор ответа с соотношением 1-1 между двумя таблицами. Тем не менее, я думаю, что это избыточно. Любая рекомендация о том, как лучше всего разработать это, обеспечивая соблюдение правил, согласно которым вопрос может иметь несколько вариантов ответа, но только один правильный ответ? Большое спасибо.

Ответы [ 4 ]

2 голосов
/ 19 мая 2010

Как насчет названия столбца CorrectAnswerId? Я сомневаюсь, что кто-нибудь примет это за что-то еще.

2 голосов
/ 19 мая 2010

Потерять столбец AnswerID из таблицы Question. Вы создаете (своего рода) круговую ссылку. Вместо этого используйте IsCorrect битовый (логический) столбец в таблице Answer. Это также даст вам возможность иметь несколько правильных ответов в будущем, если вам понадобится это средство.

Согласно точке Матти, триггер на INSERT / UPDATE записи ответа будет приводить к правильному ответу «ноль или один» на правило вопроса.

0 голосов
/ 19 мая 2010

вопросы
- id
- question_text

1, "left or right?"

answer_choices
- id
- question_id
- answer_text
- правильно

1, 1, "left", 1
2, 1, "right", 0

ответы
- id
- question_id
- user_id
- answer_choices_id

1, 1, 1234, 2 // wrong!
1, 1, 5678, 1 // yay

Итак, вы сначала запрашиваете вопрос из таблицы questions, а затем запрашиваете возможные ответы из таблицы answer_choices, которые связаны с вопросом question_id. Когда ответ дан, вы берете выбранный answer_choices_id и сравниваете его с таблицей answer_choices, чтобы увидеть, является ли correct 1 или 0.

0 голосов
/ 19 мая 2010

Три таблицы (потому что у вас может быть много «Да», «Нет», зачем дублировать это, и вы можете легко заменить «Нет» на «Нет») таблица questions_answers отображает некоторые ответы на некоторые вопросы. (Это отношения многие ко многим).

Вопросы:

  • ID
  • описание
  • correct_answer_id

ответы:

  • ID
  • описание

questions_answers:

  • question_id
  • answer_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...