MyOldAccount Ответов: 1

Дизайн базы данных для приложения викторины


Я разрабатываю базу данных для викторины, и я застрял. Я не знаю, как это сделать.

Вот соответствующая информация:

Игрок отвечает на 10 вопросов.

Каждый вопрос имеет 3 ответа. Только один ответ правильный, другие 2 неправильны.

Мне нужна помощь с дизайном базы данных.

Что я уже пробовал:

Вот мой дизайн:

Стол Players:

ID bigint (первичный ключ, идентификация)
Имя nvarchar (макс.)

Стол Questions:

ID bigint (первичный ключ, идентификация)
TextOfTheQuestion nvarchar (макс.)

Стол Answers:

ID bigint (первичный ключ, идентификация)
TextOfTheAnswer nvarchar (макс.)
Типа bigint QuestionID (внешний ключ на поставленные вопросы.Идентификатор)
бит isCorrectAnswer

Стол PlayerChoices:

PlayerID bigint (первичный ключ, внешний ключ к Players.ID)
AnswerID bigint (первичный ключ, внешний ключ к ответам.ИДЕНТИФИКАТОР)

phil.o

В чем проблема? "Завершение дизайна" само по себе не является проблемой.

MyOldAccount

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

1 Ответов

Рейтинг:
4

OriginalGriff

Ну...есть вещи, которые я бы изменил.
Во-первых, почему БИГИНТ? Сколько вопросов вы планируете задать?
Во-вторых, почему с каждым ответом связан бит, который говорит: "это правильный ответ"?
Я бы сделал это так, чтобы иметь идентификатор "CorrectAnswer" как часть вопроса, и я бы удалил ссылку из ответа на вопрос, заменив ее тремя индексами ответов. Поскольку вы фиксированы на трех ответах на каждый вопрос, это просто облегчает проверку ответов позже. И вы можете "переработать" ответы, используя их для нескольких вопросов.
Я бы также добавил еще одну таблицу, связывающую игрока, вопрос и ответ, чтобы у вас было средство записи его результатов. Я бы, вероятно, также добавил дату в эту таблицу, чтобы ваш пользователь мог повторить тест, возможно, с другими вопросами и / или ответами.

В остальном, чтобы узнать, работает ли это, нужно попробовать. На бумаге при необходимости выполните все действия, которые нужно пользователю, чтобы иметь возможность выполнить и доказать, что система работает. Если вы нашли что - то трудное, то это хороший момент, чтобы "переосмыслить" элементы вашего дизайна-попробуйте сделать это правильно, прежде чем вы зафиксируете фактическую базу данных, и все должно идти быстрее.


MyOldAccount

Спасибо за помощь.

Во-первых, почему БИГИНТ? Сколько вопросов вы планируете задать?

Наверное, я действительно переборщил... Количество вопросов-20.

Во-вторых, почему с каждым ответом связан бит, который говорит: "это правильный ответ"?
Я бы сделал это так, чтобы иметь идентификатор "CorrectAnswer" как часть вопроса, и я бы удалил ссылку из ответа на вопрос, заменив ее тремя индексами ответов.


Я согласен на перенос идентификатора " правильного ответа "в таблицу вопросов, но я не понимаю, что вы имели в виду под "удалением ссылки из ответа на вопрос, заменив ее тремя индексами ответов"." Я не знаю, как этого добиться, не могли бы Вы уточнить?

Я бы также добавил еще одну таблицу, связывающую игрока, вопрос и ответ, чтобы у вас было средство записи его результатов.

Я думал стол PlayerChoices уже делает это...

OriginalGriff

Вместо того, чтобы держать QuestionID в ответе, держите три Answerid в вопросе.

Я забыл о выборе игроков...: O
Разверните это, чтобы также ссылаться на вопрос (иначе вы не знаете, на какой вопрос это был ответ!) - и я бы все равно поставил дату и время на каждую запись. Это также позволяет упорядочить данные в той последовательности, в которой они ответили.

MyOldAccount

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

OFC... Я так и сделаю.

Разверните это, чтобы также ссылаться на вопрос (иначе вы не знаете, на какой вопрос это был ответ!)

Да, после изменения моего дизайна в соответствии с вашими предложениями это будет необходимо.

Я забыл о выборе игроков...: O

Происходит :)

Вместо того, чтобы держать QuestionID в ответе, держите три Answerid в вопросе.

Я предположил, что это была ваша идея.

Тем не менее, у меня есть одна забота о целостности данных, относительно ответов:

ID TextOfTheQuestion CorrectAnswerID WrondAnswer1ID WrongAnswer2ID

1 bla 1 1 1


Мы видим, что все 3 Ссылки могут содержать 1, но должны содержать 3 разных значения.

Как я должен защитить себя от этой ошибки ( надеюсь, вы понимаете мою точку зрения, если нет, я уточню)?

Еще раз спасибо!

OriginalGriff

Не называйте их " правильными "и" неправильными": назовите их AnswerA, Answer B, ... и имейте отдельный столбец, который содержит" правильный " идентификатор. Таким образом, вы можете вставить "правильный" ответ в любой столбец, и это облегчает их отображение - правильный ответ не всегда является первым!
Защитите себя, убедившись, что ваш код этого не делает! :смеяться:
На самом деле не стоит пытаться заставить систему запрещать комбинации на уровне БД - это действительно функция "более высокого уровня", и ее следует выполнять в вашем коде C#, где это а) проще и Б) логичнее. Почему БД должен знать, что некоторые комбинации запрещены?

MyOldAccount

Не называйте их " правильными "и" неправильными": назовите их AnswerA, Answer B, ... и имейте отдельный столбец, который содержит" правильный " идентификатор. Таким образом, вы можете вставить "правильный" ответ в любой столбец, и это облегчает их отображение - правильный ответ не всегда является первым!


Ладно, спасибо за совет.

Защитите себя, убедившись, что ваш код этого не делает! :смеяться:
На самом деле не стоит пытаться заставить систему запрещать комбинации на уровне БД - это действительно функция "более высокого уровня", и ее следует выполнять в вашем коде C#, где это а) проще и Б) логичнее. Почему БД должен знать, что некоторые комбинации запрещены?


Наверное, я слишком параноик. :) Я сделаю так, как вы сказали, и проверю код.

------------------------

У меня все еще есть проблемы с переводом ваших советов в конкретный дизайн.

Ниже приведен текущий дизайн, который у меня есть.

Не могли бы вы, пожалуйста, быстро взглянуть и предложить какие-либо улучшения/исправления? Спасибо!

--------------------------

Игроки За Столом:

ID int (первичный ключ, идентификатор)
Имя нварчар(100)

Вопросы Таблицы:

ID int (первичный ключ, идентификатор)
TextOfTheQuestion nvarchar(100)
correctAnswer int (внешний ключ к Answers.ID)
a int (внешний ключ к Answers.ID)
b int (внешний ключ к Answers.ID)
c int (внешний ключ к Answers.ID)

Таблица Ответов:

ID int (первичный ключ, идентификатор)
TextOfTheAnswer nvarchar (100)

Таблица PlayerChoices:

PlayerID int (внешний ключ к Players.ID)
QuestionID int (внешний ключ к Questions.ID)
AnswerID int (внешний ключ к Answers.ID)

OriginalGriff

Не называйте их "a", "b" и "c" - называйте их "Answer1ID", "Answer2ID" и "Answer3ID" - это немного больше набора текста, но это делает использование намного более понятным.
Аналогично, не "за украсить" свои имена: "ответы.Текст" понятнее, чем "ответы.TextOfTheAnswer" - и то же самое для вопросов.
И я бы все равно добавил метку даты в таблицу PlayerChoices.

MyOldAccount

И я бы все равно добавил метку даты в таблицу PlayerChoices.

Я просто все время забываю это делать! :) Не волнуйтесь, я сделаю так, как вы предложили.

Не называйте их "a", "b" и "c" - называйте их "Answer1ID", "Answer2ID" и "Answer3ID" - это немного больше набора текста, но это делает использование намного более понятным.
Аналогично, не "за украсить" свои имена: "ответы.Текст" понятнее, чем "ответы.TextOfTheAnswer" - и то же самое для вопросов.


Нет проблем, я просто хотел сделать комментарии/ОП кристально ясными.

---------

Так вот какой дизайн вы предлагали? Извините за вопрос, но это мой первый раз, когда я встречаю сценарий "3 внешних ключа к одному и тому же идентификатору" (вопросы таблицы имеют 4 поля, которые ссылаются Answer.ID).

Опять же, если бы вы могли тщательно проверить, что у меня нет других ошибок, я был бы благодарен. Еще раз спасибо за помощь!

OriginalGriff

Звучит примерно так.
Как я уже сказал: Попробуйте на бумаге и посмотрите, как все пойдет.

MyOldAccount

Похоже, что эта конструкция подойдет. Я предложил вам решение и официально принял его. Спасибо снова.