Разработка структуры БД - PullRequest
0 голосов
/ 30 марта 2011

Я хочу создать сайт с тестами.Тест содержит разные вопросы.Это может быть текстовое поле, флажок или радио-кнопка.Я хочу хранить в БД вопросы, ответы и пользователей.

Вот моя мысль о структуре таблиц.

Users
{
   Id
   Name
}
Questions
{
   Id
   Description
   Type // textbox, checkbox, etc
}
Answers
{ 
    Id
    UserId
    QuestionId
    AnswerValue
}

Но как я могу хранить информацию о РАЗНЫХ ответах?Я могу написать в AnswerValue что-то вроде «Морковь» (текстовое поле), «1011» (флажок), «3» (радиокнопка) и т. Д. К сожалению, я думаю, что это не очень хорошее решение.Каков наилучший способ проектирования структуры БД в моем случае?

Ответы [ 5 ]

1 голос
/ 31 марта 2011

Я обнаружил, что использование string / varchar (с кодировкой base64 для двоичных данных) является самым простым решением, и я пробовал / видел все варианты в производственной среде. Мне особенно не нравится иметь несколько столбцов, по одному для каждого типа данных. Это настоящая боль в A $$ для работы.

1 голос
/ 30 марта 2011

Ваша структура хороша для хранения нескольких ответов пользователя на один вопрос.Однако вы можете добавить поле даты и времени, чтобы вы знали , когда был дан конкретный ответ (по отношению к другим ответам на тот же вопрос).

1 голос
/ 30 марта 2011

Это довольно большой вопрос, поэтому я думаю, что отвечу на то, что я понимаю как его суть.Мне кажется, что вы ищете способ, основываясь на типе ответа, определить, какой тип элемента управления отображать.Есть две модели, которые я использовал с некоторым успехом в этом.Один из них включает в себя сохранение типа ответа, который я обычно могу сопоставить с типом .Net.Затем, основываясь на этом типе, определите, какой тип элемента управления отображать (например, строка -> TextBox, bool -> radiobutton, multiselect / array -> список флажков и т. Д.).Другое включает хранение метаданных (очень похоже на то, что вы описали выше).

В вашем случае я бы рассмотрел первое решение, поскольку оно, как правило, "проще" реализовать и требует меньшего количества предварительных знаний и программирования вокруг метаданных.Примером набора типов ответов может быть: Строка, Да / Нет, Номер, Список.Как видите, эти общие типы довольно легко отображаются на типы .Net.В случае «Список» вы можете добавить дополнительную таблицу для поиска (или AllowedValues).

Я надеюсь, что это то, что вы ищете.В противном случае, я мог бы предложить изучить похожие системы с открытым исходным кодом. Этот поиск может быть хорошим началом.

1 голос
/ 30 марта 2011

Возможно, вы просто захотите немного расширить свою таблицу «Ответы», добавив отдельное значение для каждого типа ответа: TextAnswer RadioAnswer (будет индексом для выбранной радиокнопки) CheckboxAnswer (битовая карта ужаса для проверенных значений)

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

1 голос
/ 30 марта 2011

Может быть, дизайн не так уж и плох ...
Поскольку вы знаете идентификатор вопроса, вы можете посмотреть, какой это был вопрос.

Например:

SELECT 
   Q.Type, A.* FROM Question Q, Answer A
WHERE
   Q.Id = A.QuestionId

Тогда в вашем коде, когда вы отображаете ответы, у вас будет и значение ответа, и его тип, чтобы ваш код мог обрабатываться на основе Q.Type.

Для решения проблемыкак хранить ответы на вопросы с несколькими значениями (флажки или радиокнопки), вам следует рассмотреть возможность сохранения ответов в другой таблице с отношением один ко многим.

Например, флажок вопрос можетиметь много предметов (проверяемые вещи), а флажок ответ может иметь много предметов (предметы, которые были проверены).В вашей текущей схеме, похоже, нет никакого способа сохранить описания каждого элемента.Итак, я предлагаю новые таблицы Предметы и Ответы_Items

Items{
    ItemId
    QuestionId   
    Description
}

Answers_Items{
    ItemId
    AnswerId
    AnswerValue
}
...