我有一个数据库,其中包含问题和测验(基本上是一系列问题)。教师可以创建/更新/删除问题,任何教师都可以使用这些问题来创建测试。
说爱丽丝创建一个问题,鲍勃将其用于测试。如果爱丽丝回来并修改了她的问题,那将改变鲍勃的测验,而鲍勃则不会。
为解决此问题,我正在考虑向问题中添加版本号,并将其用作主键。
table Questions:
version integer primary key
id integer -- shared by the multiple revisions of the question
owner integer
table Tests:
id integer primary key
owner integer
table Test_Questions:
question integer references Questions ON DELETE RESTRICT
test integer references Tests ON DELETE CASCADE
现在,当爱丽丝更新她的问题时,将在“问题”表中创建一个新行,而鲍勃的测验保持不变。很好,但是现在我遇到了空间浪费的问题:我不想保留无处引用的数百个修订。因此,在更新问题时,我宁愿检查是否在任何地方都引用了该问题,如果有的话,请创建一个新修订,如果没有就位更新。
我认为约束“ ON DELETE RESTRICT”可能对我有帮助:如果我的问题在任何地方都被引用,我将无法删除它,因此我可以尝试删除它,并根据结果重新插入相同的修订号,或使用新的修订号。但这感觉不对。
我想我的问题是:是否可以检查DELETE是否违反ON DELETE RESTRICT约束,所以我可以根据结果采取相应的行动?运行删除”?
答案 0 :(得分:0)
您应该在questions
的{{1}}表上拥有主键,对吧?
这将要求您在(id, version)
中同时拥有两列。
关于摆脱旧的问题版本,我将执行以下操作:
无论何时添加新的问题版本,请尝试删除同一问题的所有其他版本。
捕获并忽略类test_questions
(SQLSTATE foreign_key_violation
)的任何错误。