Database 何时分离数据库列含义(通用列) 我为一个网站设计了一个反馈系统,它有大约20个问题,但这些问题可能每年都会发生变化,并试图考虑最好的设计。

Database 何时分离数据库列含义(通用列) 我为一个网站设计了一个反馈系统,它有大约20个问题,但这些问题可能每年都会发生变化,并试图考虑最好的设计。,database,database-design,relational-database,Database,Database Design,Relational Database,最简单的方法是将每个问题映射到一列中,但这需要每年创建一个新表,并更改应用程序代码,这根本不合理 第二个选项是将列与含义分开,并有第二个应用含义的表,即 Table1: (row per survey) Table2: (row per questionnaire type) QuestionID AnswerID Question1 QuestionID Question2 Answer1 ...

最简单的方法是将每个问题映射到一列中,但这需要每年创建一个新表,并更改应用程序代码,这根本不合理

第二个选项是将列与含义分开,并有第二个应用含义的表,即

Table1: (row per survey)  Table2: (row per questionnaire type)
QuestionID                AnswerID
Question1                 QuestionID
Question2                 Answer1
...                       ....  
Question20                Answer20   
我能想到的第三个选择是完全分离各个方面,如:

Table1:       Table2:     Table3:       Table4:
QuestionID    AnswerID    MatchTableID  SetID
QuestionValue AnswerValue QuestionID    FeedbackSet
                          AnswerID      QuestionID
这给了它可伸缩性的好处,但对于每年最多改变几百条记录一次的东西来说,这可能太过分了,我不确定这是否感觉有点像实体属性值设计


如果您对这里的最佳实践和可接受实践有任何意见,我将不胜感激。

您可能希望保持简单,使用经典的关系设置

模型:

class Question < ActiveRecord::Base
  has_many :replies
  has_many :answers
  belongs_to :questionnaire
end

class Answer < ActiveRecord::Base
  belongs_to :question
  has_many :replies
end

# A collection of questions
class Questionnaire < ActiveRecord::Base
  has_many :questions
  has_many :replies, through: :questions
end

# A user reply to a question
# acts as a many to many join table
class Reply < ActiveRecord::Base
  belongs_to :question
  belongs_to :answer
end
是的,它有很多表-但是这给了你很大的灵活性,而不需要处理关键值表的麻烦。而且它的构建速度也比一些黑客尝试动态模式要快得多

如果需要的话,提取指标也非常容易

这个例子有很多假设:

  • 这些问题是多项选择题,不是写进去的。您可以通过将write-in存储在repress表中来非常简单地调整它
  • 问题与问卷的关系是一对一的。使用联接表和HABTM关系,或者如果需要能够重用多个问卷上的问题,则使用
    has\u many to:

回答很有趣,谢谢。我从语法上理解这是rails?HABMTM中的HAB是什么?这些问题是自由文本、多项选择和整数的混合。作为记录,我正在使用mssql,因为这是一个关于设计方法的问题,所以我尽量保持它的通用性。我错误地认为它被标记为Rails,所以是的,这是一个Rails示例。然而,我会构建与框架相同的数据库结构。HABTM和Many(HABTM)都有,而且都属于Many(HABTM)——最终我总是弄错了。这是在Rails中定义多对多关系的一种方法。对于自由文本、多项选择和整数的混合,您只需在answers表中存储一个类型即可。所以对于“仅限freetext”的问题,您只需添加一个freetext类型的答案。这使您可以根据自己的喜好混合搭配问题。
ActiveRecord::Schema.define(version: 20160215124045) do

  create_table "answers", force: :cascade do |t|
    t.text     "text"
    t.integer  "question_id"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
  end

  add_index "answers", ["question_id"], name: "index_answers_on_question_id"

  create_table "questionnaires", force: :cascade do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "questions", force: :cascade do |t|
    t.text     "text"
    t.integer  "questionnaire_id"
    t.datetime "created_at",       null: false
    t.datetime "updated_at",       null: false
  end

  add_index "questions", ["questionnaire_id"], name: "index_questions_on_questionnaire_id"

  create_table "replies", force: :cascade do |t|
    t.integer  "question_id"
    t.integer  "answer_id"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
  end

  add_index "replies", ["answer_id"], name: "index_replies_on_answer_id"
  add_index "replies", ["question_id"], name: "index_replies_on_question_id"

end