替代在SQL数据库中存储ID列表

时间:2014-09-24 00:35:46

标签: sql sqlite database-design

tl; dr:需要在一个第二个表中存储一个表的id数组,但我能找到的都是混乱的解决方案。

我设计的测验系统有以下数据库表(基于对this问题的最佳答案):

Quizzes
   -quiz_name TEXT PRIMARY KEY NOT NULL

Questions
   -id INTEGER PRIMARY KEY AUTOINCREMENT
   -quiz_name TEXT REFERENCES Quizzes(quiz_name)
   -prompt TEXT NOT NULL
   -difficulty TEXT NOT NULL

Answers
   -id INTEGER PRIMARY KEY AUTOINCREMENT
   -quiz_name TEXT REFERENCES Quizzes(quiz_name)
   -prompt TEXT NOT NULL
   -value INTEGER NOT NULL

Quiz_Results
   -id INTEGER PRIMARY KEY AUTOINCREMENT
   -quiz_name TEXT REFERENCES Quizzes(quiz_name)
   -num_correct INTEGER NOT NULL
   -time TEXT NOT NULL

我想要一个看起来像这样的表Question_Order:

Question_Order
   -quiz_name TEXT REFERENCES Quizzes(quiz_name)
   -???some way of storing the IDs of all questions for this quiz

我的第一直觉是将ID转换为逗号分隔的字符串并将其推送到Question_Order中,但这似乎是一个破解良好的RDBMS实践的黑客攻击解决方案。 This问题和this有人询问是否存储了ID列表。但是将问题放在一个单独的表中(而不仅仅是在测验表中将它们全部放在一起)的重点是它们可以重复使用,因此我无法添加一个"命令"列问题。我还可以为每个测验创建一个新表格(例如" First_Quiz_Order")但这也非常混乱。 如果重要的话,我会使用SQLite。

1 个答案:

答案 0 :(得分:2)

如果您希望在不同的测验中重复使用问题,则quiz_name表中不应包含questions字段。

您可以通过从quiz_name删除questions并创建表quiz_question 而不是 question_order来解决该问题以及排序问题:

 - quiz_name REFERENCES quizzes
 - question_id REFERENCES questions
 - question_order INT

这使您可以在测验中分享问题,并为问题建立(每个测验的唯一测验)顺序。