w00*_*977 6 sql sql-server oop design-patterns stored-procedures
我想在我正在使用的应用程序中开始更多地使用存储过程.该应用程序搜索十几个数据库.应用程序将信息存储在自己的数据库中.
我正在考虑将业务逻辑偏移到特定数据库中的存储过程.因此,如果逻辑对所有外部数据库都是通用的,则将其保存在应用程序(.NET)中.如果逻辑特定于数据库,则创建存储过程.
我不确定SOLID如何与存储过程和函数一起工作,因为没有接口或抽象.以下帖子似乎建议您应该尝试合并查询:http://ledgersmbdev.blogspot.co.uk/2013/02/building-solid-databases-interface.html.例如,如果存储过程有四个SQL语句,那么为什么不尝试将它们组合成一个SQL语句呢?这是帖子的意思吗?这是一种SOLID方法吗?
\n\n\n我正在考虑将业务逻辑抵消到特定数据库中的存储过程。因此,如果逻辑对于所有外部数据库都是通用的,则将其保存在应用程序 (.NET) 中。如果逻辑特定于数据库,则创建存储过程。
\n
这句话引起了我的极大关注。当您说逻辑是否特定于数据库时(我认为您指的是上述十二个数据库之一),这是一个设计缺陷。数据库就是信息存储,它们不应该需要任何“特殊”逻辑来在公开的任何视图结构之外访问它们。此外,如果需要以非设置方式操作数据,则需要将其放入应用程序中。也就是说,当计算可以抵消到您的应用程序时,不要让您执行计算。
\n\n当您设计应用程序时,您必须确保不会改变数据库以忽略关系模型。根据我的经验,这是使应用程序变得难以管理且缓慢的最佳方法之一。澄清一下,业务逻辑不应该存在于数据库中,这使得其他人很难使用您的数据。反对这一点的典型论点是,“我是唯一使用这些数据的人”,我认为这是一个糟糕的设计原因。
\n\n接下来,您应该尝试确定关系(集)模型中实际起作用的内容,并构建可以查询该数据的应用程序。而不是构建一个数据库来适合您的应用程序。话虽如此,SOLID
不适用于关系模型,因为它们不是面向对象的
\n WIKI
\n\n\n在计算机编程中,SOLID(单一职责、开闭式、Liskov 替换、接口隔离和依赖倒置)是 Michael Feathers 为 Robert C. Martin 确定的“前五项原则”引入的助记首字母缩写词1 [2] 2000 年代初期[3],它代表了面向对象编程和设计的五个基本原则。
\n
评论更新
\n\n\n\n\n应用程序链接来自不同系统的信息,并决定何时可以删除一组记录(这些是适用于所有系统的通用规则)。然后,在删除之前必须应用数据库特定的规则。我正在考虑将本地业务规则抵消到存储过程。\xe2\x80\x93
\n
看看这个评论,我不完全理解审计/软删除之外的数据库特定规则。我同意可以将数据库特定规则设置为数据库中的管理存储过程,当您遇到以下问题时,您必须划清界限:
\n\n我的应用程序查询历史数据,除非它比6 months
那时更旧,否则必须从脱机存储中检索。
在之后删除此数据的选项6 months
是允许应用程序通过某些业务逻辑清除它,或者创建一个计划任务来执行此清理,因为删除元组是正常的数据库操作。
我在这里的论点是将其放入数据库中并禁止您的应用程序调用这些过程。事实上,在正确抽象的应用程序中,您的应用程序甚至不应该知道数据库的存在。因此,如果这是您提出的示例,那么我的解决方案如下:
\n\n1) Create stored procedures in the database that only a maintenance based user can invoke, NOT THE APPLICATION \n2) Create a database scheduled task to run these based on your data needs. \n
Run Code Online (Sandbox Code Playgroud)\n