我在设计数据库方面没有多少经验。我想要一个列值来确定要查询的表,我不知道是否有更好的方法。以下是更好理解的具体问题:
我正在为调查创建者应用程序设计数据库。我想存储不同类型的问题(例如:多项选择题和基本文本问题)。我有以下表格:
QUESTION
| ID | Title | TypeID |
----------------------------------------------
| 1 | "Pick a num from 1-10" | 1 |
| 2 | "Choose some from the list:" | 2 |
TYPE
| ID | Name | ExtraValues |
--------------------------------------------
|1 |Scale Question |ScaleValues |
|2 |Multiple Choice |MultiValues |
SCALE VALUES
|Question_ID | Min | Max |
--------------------------
|1 | 1 |10 |
MULTI VALUES
|Question_ID | Name | Value |
--------------------------------
|2 | Sugar | 10 |
|2 | Milk | 20 |
|2 | Egg | 14 |
所以从现在开始,如果一个问题是“多选”类型,那么我想检查表MULTI VALUES,否则就是SCALE VALUES。我可以使用存储过程来完成它,或者我可以只查询question_ID的所有 SOMETHING VALUES表。但是有更好的方法吗?
答案 0 :(得分:1)
您当然可以这样设计数据库。但是,您无法在查询中获取“ExtraValues”列,并将该表自动拉入查询中。不是没有动态执行的sql。您最好的选择是在问题类型上使用分支逻辑,并使用它来确定从何处获取其他相关数据。
您还可以将最小和最大字段移动到QUESTION表中,并完全取消ScaleValues表。如果它是一个多选题,你可以设置为NULL。
答案 1 :(得分:0)
我认为有一个更好的方法来做到这一点。在问题和可用答案之间建立多对多的关系。添加第三列,名为points。所以你的三个表将是:
问题 - QuestionId和Text
答案 - AnswerId和文字
QuestionAnswer - QuestionId,AnswerId和Points。
错误答案奖励0分。
这种设计可能过于简单。您可能还需要一个测试表。那么你需要一个多对多表中的TestId字段,现在称之为TestQuestionAnswer。