aca*_*bot 6 sql postgresql rules
需要明确的是,通过可修改的连接视图,我指的是通过连接两个或多个表构建的视图,这些表允许插入/更新/删除操作来修改任何/所有组件表.
这可能是一个postgres特定的问题,不确定.我也感兴趣,如果其他DBMS具有可修改的连接视图的特殊功能,因为据我所知,它们在标准SQL中是不可能的.
我正在研究一个postgres模式,我最近的一些阅读建议可以使用rules(CREATE RULE ... DO INSTEAD ...)构建可修改的连接视图.可修改的连接视图似乎是可取的,因为它允许在接口后面隐藏强规范化,提供经典抽象的机制.规则是实现的唯一选项,因为无法在视图上设置当前触发器.
然而,我试图设计的第一个可修改的视图遇到了问题,我发现许多人认为非平凡的规则是有害的(请参阅评论链接到这个SO答案).另外,我在网上找不到任何可修改的连接视图的例子.
问题(编辑以在问题上提出更好的观点):
非常感谢有关此主题的任何示例/讨论的链接.谢谢.
是的,我对一般的可更新视图有一些经验.我认为它们在PostgreSQL中很实用.像所有设计选择一样,它们可能是一个不错的选择,它们可能是一个糟糕的选择.
我发现它们在处理超类型/子类型表时特别有用.我为每个子类型创建一个视图; 视图将子类型连接到超类型.撤消对基表的权限,为视图编写规则,并仅授予客户端代码访问视图的权限.然后,客户端代码完成的所有数据操作都将通过视图和在其上定义的规则进行.
我认为规则与其他任何环境中的任何其他功能都不相同.和环境,我的意思是C,C++,Java和红宝石,Python和Erlang和BASIC,不只是DBMS环境.
使用语言的好功能.避免坏的.
"不要使用malloc()"是不好的建议."总是检查malloc()的返回值"是个好建议."从不使用规则"是不好的建议."避免以已知有可疑行为的方式使用规则"是一个好建议.对于超类型/子类型表的视图所需的规则简单易懂.他们没有行为不端.
在理论层面,视图提供逻辑数据独立性.但只有在视图可更新的情况下才有可能.(许多视图应该可以由数据库引擎直接更新,而不需要任何规则或触发器.)
我个人的偏好是仅使用视图来读取数据,(实际上)从不用于插入或更新。通过本质上重新规范化数据库中的数据(这听起来像您正在做的事情),您可能会创建一个很难长期测试和维护的系统。
如果可能的话,请考虑将非规范化数据映射回应用程序代码中某处的正常模式,并在单个事务中以这种方式将其提供给数据库(恕我直言,提供给各个表)。