【问题标题】:what is the best way to create this database创建此数据库的最佳方法是什么
【发布时间】:2010-01-29 13:46:00
【问题描述】:

为问答脚本创建数据库的最佳方法是什么

用户可以提交带有一组选项的问题,其中存在正确答案

数据库必须保存问题、所有选项和正确答案。

我想到的最好方法是制作两张桌子:

问题表:

  • 身份证
  • 问题
  • Right_Answer_ID

选择表:

  • 身份证
  • 选择
  • Question_ID

我为此使用 PHP 和 MYSQL,所以如果我使用这种方式,将信息插入我的数据库会有点困难,因为我必须插入问题并插入所有选择并选择正确的选择 ID 修改该 ID 的 Right_Answer_ID 字段,这是一个漫长的过程,我确信有更好的方法来实现这一点,请帮助。

谢谢

【问题讨论】:

    标签: sql mysql database database-design


    【解决方案1】:

    这个怎么样?

    问题

    • 身份证
    • 问题

    选择

    • 身份证
    • Question_ID
    • 选择
    • Is_Right_Answer

    【讨论】:

    • 好建议!除了消除循环插入难题之外,这还为更通用的域建模铺平了道路,其中可能有多个正确答案,(或者,如果您将“Is_Right_Answer”转换为数值,则答案可能在滑动范围内被认为是“正确的”。)
    • 关于数字滑动刻度的好点!使用这个模型,我认为除了能够有多个正确答案之外,开发逻辑会更容易。但我没有想到“正确性”量表。
    【解决方案2】:

    让我想起 Joseph Heller 的 Catch-22...

    与书不同,有一个真正的漏洞:
    最简单的方法是生成您自己的 ID,而不是依赖自动递增的 ID 和其他 SQL 提供的 ID。

    这就是说,除了提醒应用程序生成的密钥和标识符有时优于系统提供的对应项,它也是一个反思数据库设计的好机会
    例如 Jeff 的回答,它建议将“正确响应”信息从 Questions 表中的“Right_Answer_ID”列移动到 Responses 表中的“IsCorrect”列,不仅解决了 INSERT 循环引用问题,还引入了更通用的数据模型:对于给定问题,我们可能有多个正确答案(或者可能通过将“IsCorrect”更改为排序的数值,其中响应可能在滑动比例上“正确”)

    【讨论】:

      【解决方案3】:

      如果选择的数量是可变的,这看起来是最好的方法 - 它已正确规范化并且易于查询。插入选项的额外 for 循环不会让您感到沮丧。您甚至可以为所有选项构建一个查询并执行一次。

      【讨论】:

        【解决方案4】:

        您的设计是一个很好的开端,但如果问题有多个正确答案,即使现在情况并非如此,但应用程序往往会发展。这将导致 Jeff 的回答,以及 mjv 为保存值而提出的问题。

        所以当只在问题表中保存“ID”和“问题”时,您可以使用该question_id来保存选项,并且在保存选项时不需要取回正确答案的ID并更新问题表。

        【讨论】:

          【解决方案5】:

          如果选择的数量是可变的或将来可以改变,那么您提出的设计是正确的方法。如果选择的数量不会改变,那么我会说有一个包含id, question, choice1, choice2, ...., choicen, correct_choice 作为字段的表就足够了。

          【讨论】:

          • 嗯...回复的数量将[永远]固定的假设经常失败。无论如何,这种类型的方法需要在编号的列名称与用户界面中的相应实体之间进行排序映射;虽然这种映射可以放在一个循环中(通过以"choice" + i 方式生成名称),但这比面向列表的方法要严格得多。例如,如何以随机顺序显示可能的答案,或者系统地排除两个错误答案?
          【解决方案6】:

          如果您有两个表,则必须有两个插入查询。您可以按照以下设计避免上次更新查询:

          问题表:

          * ID
          * Question
          * Right_Answer_Index
          

          选择表:

          * Index
          * Question_ID
          * Choice
          

          如果您需要在选择表上有一个主键,您可以将 Index 与 Question_ID 结合使用。这样,在您用于编写新问题和答案的 html 表单中,您可以有一个额外的输入来指示正确选择的索引号,因此当您插入问题时,您可以获得所需的所有信息(在正确选项之前)已添加选择记录)。

          【讨论】:

          • 在保存问题之前,您必须确保choices_index 是唯一的。在你的场景中你会如何做到这一点?
          • 索引是指一个枚举,所以如果你有四个选项,choice_indexes 将是 1、2、3 和 4。这样我们将有许多记录,choice_index 设置为 1,例如这显然不是唯一的。但是每一个都会有不同的Question_ID,我们可以使用'Question_ID,Index'的组合作为主键来唯一标识Choices表中的一条记录
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-25
          • 2022-01-05
          • 2012-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多