【问题标题】:Database Design Inquiry数据库设计查询
【发布时间】:2011-01-02 08:10:51
【问题描述】:

我正在制作一个包含独立问题和 5 个以上问题测验的琐事网络应用程序。我正在寻找有关设计此模型的建议。

应该将测验及其问题存储在单独的表/对象中,并用一个键将它们联系在一起,还是我最好将测验创建为一个独立的实体,并为每个问题的特征存储列表?或者也许有人有其他想法......

提前谢谢你。说我使用的是 Google App Engine 可能会有所帮助,它通常不赞成关系数据库模型,但如果有意义的话,我愿意走自己的路。

【问题讨论】:

    标签: python database-design google-app-engine schema


    【解决方案1】:

    没有更多信息很难说,但根据你所说的,有以下关系是明智的:

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

    这样问题就可以出现在多个测验中。

    【讨论】:

    • 虽然这是很好的关系设计,但它不适用于使用 Google 的非关系 BigTable 数据存储的 AppEngine 应用程序。 BMac,Bemmu 下面提供的答案更接近您对 AppEngine 应用程序的需求。
    【解决方案2】:

    有一个问题表、一个测验表和它们之间的映射表。这将为您提供最大的灵活性。这很简单,您甚至不一定需要整个关系数据库管理系统。我认为人们往往会忘记关系是非常简单的数学/逻辑概念。 RDBMS 只是为您处理很多杂乱的簿记。

    【讨论】:

      【解决方案3】:

      我的第一次选择(我假设问题是多项选择):

      • 我有一个问题表,其中 ID_Question 作为 PK、问题文本和类别(如果需要)。
      • 我有一个 Answers 表,其中 ID_Answer 作为 PK,QuestionID 作为 FK 返回 Questions 表、答案文本和一个关于它是否是正确答案的标志。
      • 我有一个测验表,其中 ID_Quiz 作为 PK,还有测验的描述和类别(如果需要)。
      • 我有一个 QuizQuestions 表,其中 ID_QuizQuestion 作为 PK,QuizID 作为返回到 Quizzes 表的 FK,QuestionID 作为返回到 Questions 表的 FK。

      此模型可让您:

      • 单独使用问题或在测验中使用问题
      • 让您可以在测验中提出任意多或少的问题
      • 让您可以根据需要选择尽可能多的问题(甚至是多个正确答案)
      • 在几个不同的测验中使用问题

      【讨论】:

      • 这是关系型数据库的正确设计,但 BMac 使用的是非关系型 AppEngine 的 DataStore,这种设计效率低下。
      【解决方案4】:

      我最近完成了一个用于进行性格测验的 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
              }
              ...
          ]
      }
      

      您希望在此数据结构中留下索引的事物。例如,在我的应用程序中,我发现我需要将测验创建者的 ID 留在数据之外,以便我可以对某个人创建的所有测验进行数据存储查询。我还有数据之外的创建日期,以便我可以查询最新的测验。

      created = db.DateTimeProperty(auto_now_add=True)
      

      您可能还有其他一些类似的字段。就像我说的,这是一种存储测验的非常简单的方法,不需要多个数据存储实体或测验查询。然而,它在我自己的性格测试应用程序中运行良好,并且是一种越来越流行的数据存储方式。

      【讨论】:

      • 对于没有可重复问题、需要考虑不同数量的问题以及每个问题的不同数量答案的测验,这似乎是最好的方法,尽管我'不确定我是否会亲自将标题编码到 JSON 数据中。不过这真的不重要。除非有任何新答案,否则这是迄今为止我最喜欢的答案。
      【解决方案5】:

      这里的设计将解释测验和问题之间的多对多关系。换句话说,一个测验可以有许多问题,一个问题可以属于许多测验。问题只有一份副本,因此可以对其进行更改,然后将反映在问题所属的每个测验中。

      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
      

      测验实体的问题属性保存分配给测验的每个问题实体的键。按键查找速度很快,它允许将任何一个问题分配给任意数量的单独测验。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-26
        • 2020-05-14
        • 1970-01-01
        • 2010-10-09
        • 2011-12-21
        • 1970-01-01
        相关资源
        最近更新 更多