数据库中域逻辑的时代结束了吗?[关闭]


9

我最近偶然发现了2016年的这一观点,说数据库中仍然存在领域逻辑的情况。

我认为这完全是过时的。我只是想知道那家伙是否​​仍然生活在90年代,或者这真的是真的。保留旧系统。

由于安全性要求,在数据库中包含域逻辑该怎么办?那真的是一件事吗?


3
您实际上是否完整阅读了该文章?我认为作者非常清楚地阐明了他的观点,并解释了他认为最好将BL的哪些部分放在数据库中,以及将哪些部分不放在数据库中。那么,您到底在与那篇文章的哪一点做斗争呢?
布朗

是的,它于2009年2月18日关闭,现在是错误的。
迈克尔·杜兰特

很好奇 我读过这个家伙,提供了许多SQL示例(与Oracle紧密相关),然后我回想不起来,我的客户告诉我:我忘记购买Oracle的PRE env许可证。我们有PRO专用,但没有PRE专用。您将不得不将应用程序部署一小段时间,以针对PRE中的MySQL和PRO中的Oracle进行部署...我将询问那个人,现在oracle的所有灵巧功能都将运用于何处... (这里的问题是有原因的)我不知道,架构师决定采用本机Sql行映射方式而不是Orm,但仍然接近被锁定到DB提供程序的问题
Laiv

@Laiv:太疯狂了,没有任何数量的ORM或其他抽象方法可以拯救您。通过这种设置,您基本上是将未经测试的代码部署到生产中。
JacquesB '16

2
“数据库中域逻辑的时代已经过去了吗?” 天哪,我希望如此。
Lunchmeat317

Answers:


13

如今,程序员似乎非常教条地思考,特别是当他们阅读其他人在博客中发表的想法时。

以Bob Martin的Clean Coding博客为例。作为一般观察,我发现鲍勃·马丁的著作相当清晰明了,所以让我感到困惑的是,人们不断被他所写的东西(例如SOLID原理)所迷惑。当他们可能应该做的只是简单地努力编写更好的代码并首先获得一些经验,以便他们阅读时,他们就沉迷于“单一职责”应该是什么,或者为什么有些班级违反了Liskov的原理。博客有一定的背景。


基本上,您要说的是数据库应包含表和数据,仅此而已。但是数据库非常适合于做某些特定的事情……好,数据库擅长。

本文引用了以下内容:

  • 数据完整性和验证(例如,空约束和唯一约束)
  • 行级安全
  • 使用存储过程编写API
  • 计算余额
  • 向数据库提问(即查询和报告)
  • 避免诸如N + 1之类的ORM问题

作为适合放入数据库的东西。我碰巧同意他的看法。

您没有将业务逻辑(通常)放入数据库的原因:

  • 供应商锁定
  • 您的数据库不是中央机构
  • 您的团队不以为然
  • 劣质的工具。

但是这些事情通常仅适用于数据库并非唯一适合的那些技术,工具和培训。

因此,与软件开发中的任何其他技术一样,这取决于。您评估替代方案,然后根据您认为对特定应用程序可能采取的最佳行动方案做出决定。


3
一个很好的细分,也是解决问题的更好方法。
candied_orange

9

在此处输入图片说明

马和马车的时代已经过去,但是您仍然可以购买马车的马鞭。

为什么?当汽车更快,维护更便宜并且忽视它们不会引起人道社会的来访时,为什么马车仍然存在?

因为有时候,除了受欢迎的原因之外,您还有其他原因要做某事。

您应该学习的是数据库中的域逻辑为什么会导致问题以及任何人可能从中摆脱出来的原因。然后下定决心。

我个人的看法:

域逻辑与行为有关。数据库是关于持久性,关系以及数据的。当您看到这种方式时,业务规则不应出现在数据库中。

另一方面,谁说数据库无法运行?我已经使用Filemaker建立了办公数据库。人们称它为数据库,但实际上它也是整个应用程序开发环境。一切都无缝集成到一个数据库中。

通常在极端观点之间发现智慧。我毫不怀疑,无论是可以工作。尝试找到中间位置时,很容易跟随人群。在这里,我将对此警告。

将域逻辑保留在数据库中的系统可以正常工作。将域逻辑排除在数据库之外的系统可以正常工作。一个在两个地方都混有域逻辑的系统会让我发疯。我不知道在哪里放新行为。我不确定在哪里可以找到旧的行为。

如果您仍然不能决定掷硬币,则可以将其作为任何特定项目的福音。据我所知,硬币与其他任何人一样,都知道最好。


1
您的回答听起来您甚至没有看过OP链接的文章(不是说作者是对还是错),但是您能告诉我们您对该文中所描述的观点的同意或不同之处吗?
布朗

@DocBrown我也没有读过,但是无论如何我完全同意,这个答案是一个很好的答案。它解决了OP的问题(最后一句话),而不是引用的文章。
qwerty_so 2016年

@DocBrown我不认为文章了Bob大叔文章,它援引:“插件架构是非常强大的,因为稳定的高价值业务规则可以根据挥发性低价值的模块,如用户界面和数据库保存。” 鲍勃叔叔比我对这个想法有更强的看法。本文摘自鲍勃的文章,使鲍勃似乎在说他不是。
candied_orange

2

我曾经遇到过一个案例,那就是在业务层解决它会成为真正的性能杀手。

我们的应用程序OO安全概念由角色和组组成。两者都是递归结构。我们编写了一个存储过程,用于解决用户对域对象的权限。

倒退到数据库逻辑的需求确实很少。但是在这种情况下,我决定采用这种方式。但是,您始终必须考虑的是:放弃抽象。一旦在数据库中有了业务逻辑,就很难更改持久层。所以要非常小心。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.