对Postgres数据库中的数据进行版本控制

时间:2019-09-20 12:47:17

标签: postgresql database-design

我有一个数据库,其中包含问题和测验(基本上是一系列问题)。教师可以创建/更新/删除问题,任何教师都可以使用这些问题来创建测试。

说爱丽丝创建一个问题,鲍勃将其用于测试。如果爱丽丝回来并修改了她的问题,那将改变鲍勃的测验,而鲍勃则不会。

为解决此问题,我正在考虑向问题中添加版本号,并将其用作主键。

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约束,所以我可以根据结果采取相应的行动?运行删除”?

1 个答案:

答案 0 :(得分:0)

您应该在questions的{​​{1}}表上拥有主键,对吧?

这将要求您在(id, version)中同时拥有两列。

关于摆脱旧的问题版本,我将执行以下操作:

  • 无论何时添加新的问题版本,请尝试删除同一问题的所有其他版本。

  • 捕获并忽略类test_questions(SQLSTATE foreign_key_violation)的任何错误。