基于模板的评估系统的数据库设计

时间:2014-07-12 05:58:59

标签: sql database

我们正在开发一个数据库来存储我们进行的一些评估。有几种不同类型的评估,有些已经随着时间的推移而发生变化。因此,我们需要记录评估在进行时的确切情况。

我认为支持这种情况的最佳方式是通过模板样式系统。 随着:

  • 保存所有可能选项的表格;
  • 将表格选项映射到模板;
  • 将参与者映射到日期/时间的模板的评估表;和
  • 将评估者评论的表映射到评估选项。

这是设计的骨架:

CREATE TABLE options (
    id SERIAL PRIMARY KEY, 
    option TEXT NOT NULL
);

CREATE TABLE templates ( 
    id SERIAL PRIMARY KEY, 
    name TEXT NOT NULL
);

CREATE TABLE template_options ( 
    template INTEGER NOT NULL REFERENCES templates( id ), 
    option INTEGER NOT NULL REFERENCES options( id ), 
    UNIQUE ( template, option )
);

CREATE TABLE participants ( 
    id SERIAL PRIMARY KEY, 
    name TEXT NOT NULL
);

CREATE TABLE evaluations ( 
    id SERIAL PRIMARY KEY, 
    template INTEGER NOT NULL REFERENCES templates( id ),
    participant INTEGER NOT NULL REFERENCES participants( id ), 
    date TIMESTAMP WITH TIME ZONE NOT NULL
);

CREATE TABLE evaluation_data ( 
    template INTEGER NOT NULL REFERENCES templates( id ), 
    option INTEGER NOT NULL REFERENCES options( id ), 
    evaluator_comments TEXT NOT NULL, 
);

该设计能够捕获我们的数据,但不会将evaluation_data中保存的选项限制为评估模板选项映射中指定的子集。我们可以用一个触发器强制执行它(我们肯定可以用应用程序逻辑来实现它[我们现在正在这样做])但是我们是否正在使用这种设计走错路?

有人能想出更好的方法吗?

编辑: 添加了一个潜在触发器的示例,我们需要使用它来确保使用此设计强制执行有效选项。

CREATE FUNCTION valid_option() RETURNS trigger as $valid_option$
    BEGIN
        IF NOT NEW.option IN ( SELECT template_options.option
                           FROM template_options
                           INNER JOIN templates 
                           ON template_options.template = templates.id
                           WHERE templates.id = ( SELECT evaluations.template 
                                                  FROM evaluations
                                                  WHERE evaluations.id = NEW.evaluation ) ) THEN 
            RAISE EXCEPTION 'This option is not mapped for this evaluations template.';
        END IF;
        RETURN NEW;
    END
$valid_option$ LANGUAGE plpgsql;

CREATE TRIGGER valid_option BEFORE INSERT ON evaluation_data FOR EACH ROW EXECUTE PROCEDURE valid_option();

1 个答案:

答案 0 :(得分:0)

请记住,您需要两组表格。第一组包含向参与者显示评估所需的评估,问题,答案替代,类别(?)。用于记录评估数据的第二组表(即参与评估的参与者):哪些评估,哪些问题,哪些答案替代以及它们呈现的顺序,他们输入了哪些答案(他们是否允许回答相同的答案)问题多次?)等。

我们正在使用以下结构(我已经删除了主题评分,因为您没有询问它):

提出评估的模型:

Assessment: assessment_name, passing_status, version
Question: assessment, question_number, question_type, question_text
AnswerAlternative: question, correct?, answer_text, points

记录评估的模型(参与者进行评估):

Progress: started_timestamp, finished_timestamp, last_activity, status (includes "finished")
Result: user, assessment, progress, currently_active, score, passing_grade?
Answer: result, question, selected_answer_alternative, answer_text, score

为了实现您的目标,我会通过将生成的评估写入表并从Reault指向它来扩充此目标。您还可以记录选择和表示标准,以便您可以以编程方式重新生成评估(即,如果您从较大的问题数据库中选择问题并在向参与者呈现答案之前重新排序答案选项)。

相关问题