Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 你如何保持你的商业规则干净利落?_Ruby On Rails_Database Design_Dry - Fatal编程技术网

Ruby on rails 你如何保持你的商业规则干净利落?

Ruby on rails 你如何保持你的商业规则干净利落?,ruby-on-rails,database-design,dry,Ruby On Rails,Database Design,Dry,在完美的应用程序中,每个业务规则只存在一次 我在一家商店工作,该商店在数据库中尽可能多地执行业务规则。在许多情况下,为了获得更好的用户体验,我们在客户端执行相同的验证。不太好。作为一个纯粹主义者,我讨厌这样 另一方面,一些商店创建哑数据库(Rails社区倾向于这个方向),并将业务逻辑降级到一个单独的层。但即使采用这种策略,一些验证逻辑最终也会在客户端重复出现 让事情更复杂的是,我理解为什么数据库应该是,所以我同意在数据库中强制/重复验证 考虑到相互冲突的问题,尝试在一个位置强制执行验证并不容易—

在完美的应用程序中,每个业务规则只存在一次

我在一家商店工作,该商店在数据库中尽可能多地执行业务规则。在许多情况下,为了获得更好的用户体验,我们在客户端执行相同的验证。不太好。作为一个纯粹主义者,我讨厌这样

另一方面,一些商店创建哑数据库(Rails社区倾向于这个方向),并将业务逻辑降级到一个单独的层。但即使采用这种策略,一些验证逻辑最终也会在客户端重复出现

让事情更复杂的是,我理解为什么数据库应该是,所以我同意在数据库中强制/重复验证

考虑到相互冲突的问题,尝试在一个位置强制执行验证并不容易——保持干爽,保持数据库的堡垒地位,并提供良好的用户体验。我有,但我想还有更好的


我们能否以干巴巴的方式平衡这些相互冲突的关注点?

任何人如果不在所属的数据库中强制执行所需的业务规则,都会有糟糕的数据,就这么简单。数据完整性是数据库的工作。数据库受到的影响比应用程序多得多,只在应用程序中放入所需规则是短视的。如果您这样做,您将从导入、连接时的其他应用程序、修复大量数据的临时查询(考虑将所有价格提高10%)等中获得坏数据。仅通过应用程序强制执行规则是非常愚蠢的。但是,我是一个必须修复坏数据的人,这些坏数据进入了设计糟糕的数据库,而应用程序开发人员认为他们应该只在应用程序中做一些事情


在许多情况下,这些数据将长期存在于应用程序之上。当这种情况发生时,你也会失去规则

模型-视图-控制器框架是解决此问题的一种方法。rails社区使用了类似的概念

其基本思想是,所有业务逻辑都在控制器中处理,当需要在视图或模型中应用规则时,这些规则由控制器传递到视图或模型中

在某种程度上,将所有业务逻辑存在于单个核心位置的关注点完全分离是一种乌托邦式的幻想,很难坚持

不明白为什么

在一个单独的层中处理所有业务逻辑(在Rails中,模型将容纳“大部分”业务逻辑)

对。Django也这样做

某些业务逻辑最终会溢出到其他地方(在Rails中,它可能会溢出到控制器中)

不完全是。业务逻辑可以——也应该——在模型层。其中一些将被编码为类、库和其他可在其他地方使用的逻辑束的方法。Django使用验证输入的表单对象来实现这一点。这些对象来自模型,但作为前端HTML以及任何批量加载的一部分使用。

没有理由在别处定义业务逻辑。它可以在其他层中使用,但应该在模型中定义

使用ORM层从模型生成SQL。所有内容都放在一个地方

[数据库]建立在导致其拒绝坏数据的约束之上

我认为这是对文章的误读。它说“一个可靠的数据模型”,“拒绝不属于的数据,并阻止没有意义的关系”。这些都是简单的声明性引用完整性


ORM层可以从模型中生成这一点。

一般来说,业务规则远不止是一组约束,因此很明显,并非所有业务规则都可以放在数据库中。另一方面,HLGEM指出,期望应用程序处理所有数据验证是幼稚的:我可以从经验中证实这一点


我认为没有一种好方法可以将所有业务规则放在一个地方,并将它们应用到客户端、服务器端和数据库上。我在实体级别上使用业务规则(正如hibernate在数据库级别上重新创建它们一样)还有服务级别的其余规则。

作为堡垒的数据库和单点真理的关注点是一回事。它们不是相互排斥的。因此,不需要任何东西来“平衡它们”

你所说的“作为堡垒的数据库”实际上是实现单点真理的唯一可能的方法


“database-as-a-fortress”是一件好事。它意味着数据库迫使任何不想遵守的人远离(数据库应该遵守的事实)。如此多的人发现这是一个问题(而不是真正的解决方案),讲述了大多数数据库用户如何看待“真相”的重要性(而不是“我有这么多需要持久化的对象,我只希望数据库能够做到这一点,不管有什么商业规则。”).

对于关系数据库来说,Database-as-a-fortress毫无意义。你需要一个OODB来解决这些问题。

解决所有这些问题的简单方法是打破体系结构,绕过放在数据库之外的业务规则层。防止这些问题的简单方法是“直接”访问数据库是解雇的理由。强烈反对。我不是使用应用程序一次导入一百万条记录。我也不应该这样做重大数据更新。你是否建议导入一百万条记录,并在数据库中完成完整的数据验证?这是如何工作的?存储过程?这不是很糟糕吗速度慢?或者加载前必须先运行一些验证步骤?我不明白您的建议。“数据库受的源比应用程序受的源多得多”影响数据库的所有其他“源”都需要经过应用程序的业务层。如果