2010-05-18 6 views
0

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

+2

Что бы вы ни делали, независимо от того, какой из них вы выбираете, пожалуйста, для любви к Богу, не вызывайте ПК каждого идентификатора таблицы. –

+0

@Stephanie Страница: Пожалуйста, ради любви к Богу, почему вы так говорите? – naivnomore

+0

Недостаточно места для комментариев для полной диссертации, но ... скажем, у вас есть несколько запросов таблицы (скажем, 5). У вас есть пять столбцов, все названные точно одинаковыми, все значения совершенно разные. Согласитесь ли вы, что для любой другой колонки? Разрешите ли вы, чтобы столбец «СТОИМОСТЬ» означал 5 разных вещей в пяти разных таблицах? Вы хотите называть их «TOTAL_COST», «DIRECT_COST», «AVERAGE_COST» и т. Д.? Так почему бы вам сделать это с помощью идентификатора? Это всего лишь один из причин, по которым это не так. И у людей с другой стороны есть только один аргумент, нажатия клавиш. В этот день это плохое оправдание. –

ответ

2

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

Пункт Перта Матти, триггер на INSERT/UPDATE записи ответа, обеспечит правильный или правильный правильный ответ на вопросное правило.

+1

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

+0

@ Matti - хороший пункт. Триггер INSERT/UPDATE выполнил бы трюк. –

+0

Поле бит IsCorrect в таблице выбора - это самый гибкий подход, который может потребоваться в будущем, если потребуется в будущем, иметь несколько правильных ответов на вопрос, просто переключив значение поля 0 или 1. –

2

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

+1

+1 Проще чем мое решение! –

+0

@Bob +1 для подтверждения этого, а не обычного на SO – xandercoded

+0

Я предполагаю, что вы просите меня переименовать имя столбца в таблице вопросов в «CorrectAnswerID». Я, конечно, могу это сделать, но, по-моему, это все еще не меняет исходную проблему. Он по-прежнему будет выглядеть так, как если бы таблица выбора ответов имела отношение 1: N к таблице вопросов. Это неважно. Я просто хотел знать, был ли какой-нибудь лучший дизайн, учитывая мои требования. – naivnomore

0

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

вопросы:

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

ответы:

  • идентификаторов
  • Описание

questions_answers:

  • question_id
  • answer_id
+0

, вы можете также рассмотреть другую таблицу, чтобы идентифицировать пользователей и другую, чтобы определить, какие ответы выбранному пользователю ... – Randy

0

вопросы
- идентификатор
- question_text

1, "left or right?"

answer_choices
- идентификатор
- question_id
- ANSWER_TEXT
- правильно

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

отвечает
- идентификатор
- question_id
- user_id
- answer_ch oices_id

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

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

+0

Что делает идентификатор в таблице ответов? –

+0

Просто уникальный идентификатор для ответа пользователя. Полезно ли это от использования. Вы также можете отказаться от него и использовать 'question_id' в сочетании с' user_id', чтобы идентифицировать его. – Alec

+0

Правильное поле в таблице выбора ответов оставляет слишком много пробелов, так как может быть только один правильный ответ на любой вопрос. Вместо этого у вас может быть правильное поле в таблице вопросов или создать другую таблицу с идентификатором вопроса и правильным полем. Однако моя проблема не в этом. Как лучше всего создать эти таблицы, чтобы не было избыточности или дубликатов. – naivnomore

Смежные вопросы