Запрос дизайна базы данных - PullRequest
1 голос
/ 07 января 2010

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

Следует ли тест и его вопросы хранить в отдельных таблицах / объектах с ключом, чтобы связать их вместе, или мне лучше создать тест в виде отдельного объекта, в котором списки хранятся для каждой характеристики вопроса? Или, может быть, у кого-то есть другая идея ...

Спасибо заранее. Вероятно, было бы полезно сказать, что я использую Google App Engine, который обычно не одобряет реляционные модели БД, но я готов пойти своим путем, если это имеет смысл.

Ответы [ 5 ]

3 голосов
/ 07 января 2010

Трудно сказать без дополнительной информации, но разумно было бы иметь следующие отношения, основываясь на том, что вы сказали:

Quiz (id, title)
Question (id, question, answer)
QuizQuestion (quiz_id, question_id)

Таким образом, вопросы могут появляться в нескольких викторинах.

1 голос
/ 07 января 2010

Я недавно запустил приложение App Engine для тестирования личности.

Я бы сказал, пошли по супер простому маршруту и ​​сохранили все о каждой викторине в одной сущности Викторины. Если вам не нужно повторно использовать вопросы между тестами, не нужно искать или каким-либо другим способом получить доступ к структуре теста, кроме проведения теста, вы можете просто сделать:

class Quiz(db.Model):
    data = db.TextProperty(default=None)

Тогда данные могут иметь структуру JSON, например:

data = {
    "title" : "Capitals quiz",
    "questions" : [
        {
            "text" : "What is the capital of Finland?"
            "options" : ["Stockholm, Helsinki, London"],
            "correct" : 1
        }
        ...
    ]
}

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

created = db.DateTimeProperty(auto_now_add=True)

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

1 голос
/ 07 января 2010

Мое первое сокращение (я предполагал, что вопросы были с множественным выбором):

  • У меня будет таблица вопросов с ID_Question в качестве PK, текстом вопроса и категорией (если хотите).
  • У меня будет таблица ответов, с ID_Answer в качестве PK, QuestionID в качестве FK для таблицы вопросов, текстом ответа и флажком, чтобы определить, правильный ли это ответ или нет.
  • У меня будет таблица Викторин с ID_Quiz в качестве ПК, описание викторины и категория (если хотите).
  • У меня будет таблица QuizQuestions, с ID_QuizQuestion в качестве PK, QuizID в качестве FK обратно в таблицу Quizzes и QuestionID в качестве FK обратно в таблицу Вопросы.

Эта модель позволяет вам:

  • Используйте вопросы отдельно или в викторинах
  • Позволяет задавать столько или несколько вопросов в викторине, сколько вы хотите
  • Позволяет вам выбирать из нескольких вариантов вопросов (или даже нескольких правильных ответов)
  • Используйте вопросы в нескольких различных викторинах
0 голосов
/ 07 января 2010

Вот схема, которая учитывает наличие отношения «многие ко многим» между Викториной и Вопросами. Другими словами, у Викторины может быть много вопросов, и Вопрос может принадлежать многим Викторинам. Существует только одна копия Вопроса, поэтому в него можно внести изменения, которые затем будут отражены в каждой Викторине, к которой принадлежит Вопрос.

class Quiz(db.Model):
    # Data specific to your Quiz: number, name, times shown, etc
    questions = db.ListProperty(db.Key)

class Questions(db.Model):
    question = db.StringProperty()
    choices = db.StringListProperty() # List of possible anwsers
    correct = db.IntegerpProperty() # index of string in choices that is correct

Свойство вопросов объекта Викторина содержит ключ каждого объекта Вопроса, который назначен для Викторины. Поиск по кнопке быстр и позволяет назначить любой вопрос на любое количество отдельных тестов.

0 голосов
/ 07 января 2010

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

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