Database design 在没有存储过程或触发器的情况下工作

Database design 在没有存储过程或触发器的情况下工作,database-design,stored-procedures,triggers,normalization,platform-agnostic,Database Design,Stored Procedures,Triggers,Normalization,Platform Agnostic,在过去的18个月里,我们一直在开发复杂的数据库和客户端界面。我们定期向该应用程序添加新功能,现在我们所有办公室(包括网站和海外)每天都有数十名用户使用该应用程序。这只是告诉您,它是一个具有真实数据库的真实应用程序 到目前为止,我们仍然不需要编写任何存储过程,除了临时解决客户机版本和更新的数据库模型之间的小问题(在每个人都安装最新版本之前,旧的客户机版本不会正确更新新创建的字段) 同样,我们仍然不需要任何触发器。事实上,唯一的SP和触发器是系统SP和触发器,或者是为复制目的添加的SP和触发器 我有

在过去的18个月里,我们一直在开发复杂的数据库和客户端界面。我们定期向该应用程序添加新功能,现在我们所有办公室(包括网站和海外)每天都有数十名用户使用该应用程序。这只是告诉您,它是一个具有真实数据库的真实应用程序

到目前为止,我们仍然不需要编写任何存储过程,除了临时解决客户机版本和更新的数据库模型之间的小问题(在每个人都安装最新版本之前,旧的客户机版本不会正确更新新创建的字段)

同样,我们仍然不需要任何触发器。事实上,唯一的SP和触发器是系统SP和触发器,或者是为复制目的添加的SP和触发器

<>我有一种奇怪的感觉,当开发人员认为数据库优化必须反对数据库规范化时,SPS和触发器主要用于补偿数据库设计默认值和/或绕过数据库设计规则。p> 问题是这些工具非常耗时(无论是开发还是维护)。然后,每个开发人员都应该非常小心地使用它们,记住它们是数据库中维护的最“昂贵”的项目

我们可以认为数据库中没有或很少的存储过程/触发器是其归一化水平和/或代码维护成本的一个很好的指示吗?p> 编辑:

有些人提供了使用触发器和SP的合理参数。但我一直认为,这些工具在大多数情况下被不当或过度使用。设置了多少触发器来在表字段之间进行一些奇特的更新,或者重新计算总计或其他聚合数据?有多少SP用于构建报告问题的临时表?这是开发人员使用这些工具的许多情况中的两种,我认为这通常说明了数据库设计/规范化的缺陷

还有一些人承认应该严格控制SP和触发器的使用。我也觉得有必要

我必须承认,我正在试图找到一些支持的论据,所有在我们其他数据库工作的SQL极客都瞧不起我们,告诉他们的朋友“你知道吗?他们甚至不使用SPs和触发器!哈哈!”

我们可以认为数据库中没有或很少的存储过程/触发器是其归一化水平和/或代码维护成本的一个很好的指示?

不,你不能

规范化和存储过程是完全分开的

我对SP的看法是数据库和使用它的人之间的抽象层


强制人们使用SP而不是直接CRUD操作将更容易更改表的设计,而不会破坏它们。

否。存储过程和触发器的使用方式多种多样。这取决于环境、开发人员等。例如,存储过程通常用作安全机制


我认为唯一适合使用触发器的地方是重构数据库时。因此,也许你对这一点有所了解。但是其他人可能会以其他方式使用它们。

存储过程和触发器都是工具——在数据库管理系统中使用的非常特定的工具

触发器有很多用途,从极大地简化历史表的维护(其中每一行表示主表的过去时间段)到将ETL请求排队到数据仓库(取决于特定的RDBMS)

无论是从应用程序还是从SQL命令行工具调用存储过程,它们都有自己的位置

包含存储过程或触发器实际上与规范化或“数据库设计默认值”无关。它们在应用程序中的使用通常与应用程序的其他需求直接相关,这些需求包括可伸缩性、可靠性、复制或使用这些工具可以最有效地满足的其他需求


如果您不需要它们,就不要使用它们。但是,不要认为触发器或存储过程的存在表明设计不佳。

如何从数据库中获取数据?您是否构建并执行SQL字符串?如果是这样,您如何验证这些条目不会破坏数据库?存储过程有助于大大降低这种情况的风险,因为服务器将文本作为文本而不是命令来处理

存储过程通常比对数据库执行SQL字符串快得多,这也意味着您不必为不同的信息组编写不同的选择,因为这一切都可以由存储过程完成。从程序中提取数据库的能力也是一个好处,这一点已经提高了几次

最后,我只在数据库审计中使用了触发器(在SQL2005之前,没有内置的审计功能),它将使用每次更改的prev和新值更新表


正常化和优化与存储的过程或触发器无关,规范化和优化可能会影响您对数据库的抽象程度,但在我看来,每次更改数据库时都必须重构代码比使用存储过程要糟糕得多。没有什么比在代码中遇到一大堆有缺陷的内嵌SQL更让我讨厌的了。至少在存储过程中,您可以对其进行语法检查,甚至可以执行它以查看问题所在。更不用说,在保存执行计划时,这比在数据库中触发查询要快。我一直认为DB代码属于DB,但这只是我的观点


触发器也有其用途。它们并不总是最好的,但肯定是有原因的。

至于存储过程,我们不必担心