对不可变字段的数据库支持

时间:2014-03-05 11:55:01

标签: sql postgresql immutability

我们即将开始一个新项目,我现在打破了这些模型。我正在建模的大多数实体都是不可变的。

虽然我可以通过使用类似django-immutablemodel之类的东西在代码级别控制这一点,但如果我可以在数据库级别强制执行此操作,我会更自在。

我打算使用postgresql,但如果他们支持,我会愿意考虑替代方案。据我所知,目前主要有两种方法:

  1. 添加一组触发器以确保不会修改不可变字段
  2. 通过用户权限强制实现不变性(即不向用户提供不可变的列的用户更新权限)
  3. 如果有人尝试过这些方法并对其进行评论或知道更好的方法,我会感兴趣。

    对于某些字段,我希望成为有效的一次写入,因此如果字段为NULL,则允许将其更新为某个值,但绝不允许更新具有值的字段。这表明我需要走下触发路线。

1 个答案:

答案 0 :(得分:2)

如果大多数实体(表格?您稍后提及列)是不可变的,则将该信息放在单独的表中并撤消对这些表的所有访问权限。为可修改的数据创建第二个表,同时撤消所有权限,并使用密钥链接这两个表。现在创建一个从两个表构建的视图,并创建一个INSTEAD OF INSERT OR UPDATE OR DELETE触发器,该触发器限制对可修改表的更新。

还有其他可能的解决方案,例如列权限,但上述解决方案具有良好的副作用,您可以优化只读表访问,并且您只需要备份可修改的几个表。