我读过Tom Kyte的“设计有效的Oracle”。在那里他说要在DB本身编写大部分代码来减少应用程序代码。它在分布式环境中很好,但它在独立应用程序中也有优势吗?
我的应用。在.NET中。
答案 0 :(得分:6)
是的,即使对于独立的应用程序,将业务逻辑放在Oracle数据库中也有很多优点:
我实际上会偷走Josh的一些答案并将其转动180度:
如果你的数据库只会这样 支持单个应用程序和IF 你永远不会期望相同的数据 不同的用例取决于谁 使用它...然后肯定把业务 ......中的逻辑。
<强>应用强>
我的意思是,您是否真的希望两个不同的应用程序访问相同的数据行,但应用不同的规则来更改该数据?如果只是通过使用不同的访问路径来破解它,那么拥有“规则”有什么意义呢?
请注意,我省略了Josh答案的这一部分:
...如果你从来没有计划过 使用不同的存储机制......
当然,如果你打算支持多个数据库,或者扔掉Oracle并开始使用SQL Server或其他东西完全存储你的数据,那么你就不会想要使用PL了/ SQL编写代码。但是在许多情况下,很多情况都不会发生,而且为了自己的利益而不建议追求数据库独立性。
答案 1 :(得分:2)
IF 您的数据库只支持单个应用程序, IF 您永远不会期望相同的数据根据谁使用它来使用不同的用例, IF 你永远不会计划使用不同的存储机制......然后确保将业务逻辑放在数据库中。
然而,如果其中任何一个是真的(我怀疑)。然后我,也许这个网站上的大多数人会强烈建议你不要走这条路。
将逻辑放入数据库可能很诱人,因为您认为“我可以动态更改它!”但这是一条你不想走的维修之路。聆听经验之声,并将您的疑虑分开。
我的应用。是一个独立的Windows应用程序。 这是库存和发票 解。目前,我写了课 包含执行各种方法 数据库操作,如插入,更新和 删除。我想知道,如果我能写的话 存储过程在DB本身和 只通过.NET传递参数 前端,它有什么优势 给?
这对我来说实际上听起来并不像商业逻辑,除非你当然要做的不仅仅是CRUD操作。在这种情况下,那么您是否在代码中使用存储过程,ORM或手动生成的查询是一个实现细节。
数据访问层应该关心连接到数据存储机制,但应用程序的其余部分应该不关心。我将举例说明:
public class MyDomainObject
{
public String Name {get; set;}
public Boolean IsValid()
{
return !String.IsNullOrWhitespace(Name) &&
DoesNotContainInvalidCharacters(Name);
}
}
public class MyDataAccess
{
public List<MyDomainObject> GetAll()
{
//Some data access logic here
}
public MyDomainObject GetByName(String name)
{
//Some data access logic here
}
public void Save(MyDomainObject)
{
if(MyDomainObject.IsValid)
{
//Some data access logic here
}
}
}
现在您有一个域对象和一个数据访问对象。域对象强制执行一些可以通过IsValid属性检查的简单业务逻辑,数据访问层使用它来确定是否应该保存它。但是,数据存储方式的详细信息对域/业务层并不重要。
如果你想重构使用存储过程,那么你的应用程序应该不在乎。