Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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_Database Design - Fatal编程技术网

Ruby on rails 服务器端数据库编程:为什么?

Ruby on rails 服务器端数据库编程:为什么?,ruby-on-rails,database,database-design,Ruby On Rails,Database,Database Design,考虑到数据库通常是(web应用程序的)可伸缩性最低的组件,是否存在这样的情况:人们会将逻辑放在过程/触发器中,而不是将其保存在自己最喜欢的编程语言(ruby…)或她最喜欢的web框架(…rails!)。您将处理和数据一起保存在数据库中 如果您在服务器端处理数据,那么您必须通过网络将数据传输到服务器进程,对其进行处理,然后(可选地)将其发回。您有网络带宽/延迟问题,还有内存开销 澄清一下——如果我有1000万行数据,我的两种极端情况是:a)通过网络拉取这1000万行数据,并在服务器端进行处理,或b

考虑到数据库通常是(web应用程序的)可伸缩性最低的组件,是否存在这样的情况:人们会将逻辑放在过程/触发器中,而不是将其保存在自己最喜欢的编程语言(ruby…)或她最喜欢的web框架(…rails!)。

您将处理和数据一起保存在数据库中

如果您在服务器端处理数据,那么您必须通过网络将数据传输到服务器进程,对其进行处理,然后(可选地)将其发回。您有网络带宽/延迟问题,还有内存开销


澄清一下——如果我有1000万行数据,我的两种极端情况是:a)通过网络拉取这1000万行数据,并在服务器端进行处理,或b)使用为此目的优化的服务器和语言(SQL)在数据库中进行处理。请注意,这是一个概括,不是一个硬性的规则,但我在大多数情况下都遵循这一规则。

当许多异构应用程序和各种其他系统需要访问您的单个数据库,并通过其操作确保数据保持一致而不存在完整性冲突时。因此,您将逻辑放入触发器和存储过程中,这些触发器和存储过程将为外部客户端提供接口。

可能不适用于大多数基于web的系统,但肯定适用于企业数据库。存储过程等允许您更好地控制安全性和性能,并为数据库本身提供一些封装。只要存储过程接口保持不变,您就可以随意更改架构。

触发器意味着第三方应用程序可以修改数据库,而不会造成逻辑不一致。

  • 服务器端逻辑通常要快得多,即使使用过程方法也是如此

  • 你可以微调你的授权选项,隐藏你不想显示的数据

  • 所有查询在一个地方比分散在代码中更方便

在我的博客中有一篇(非常主观的)文章介绍了我喜欢存储过程的原因:

顺便说一句,我通常不喜欢触发器(与函数/存储过程/包相反)


它们完全是另一回事。

如果你这样做,你就是在把你的业务逻辑与你的模型联系起来。如果您用T-SQL编写所有业务逻辑,那么如果以后需要使用Oracle或其他什么作为数据库服务器,您将不会有很多乐趣。事实上,我不确定我是否完全理解这个问题。您认为这将如何提高可伸缩性?它真的不应该。如果数据库是共享的,那么在数据库中有逻辑更好,以便控制发生的一切。如果不是,则可能会使系统过于复杂。

如果有多个应用程序与数据库通信,则存储过程和触发器可以更普遍地强制执行正确性。因此,如果正确性比方便性更重要,那么将逻辑放入数据库是明智的

不过,可伸缩性可能是一个障碍。有时,在OO语言的领域层中表达您想要的行为更容易,但实际上可能比使用惯用的SQL方式更昂贵


前一家公司的安全机制首先构建在服务层,然后推送到db端。这种动机实际上是由于我们使用的数据访问框架中存在一些限制。由于我们的安全模型很复杂,解决方案有点问题,但好处是只需要在数据库中修复错误;我们不必担心不同的客户端遵循不同的规则。

就我个人而言,我真的不喜欢触发器,尤其是在专用于单个应用程序的数据库中。我讨厌试图找出某些数据不一致的原因,发现这是因为触发器写得不好(而且很难精确地得到正确的触发器)。

在(几乎)任何情况下,您都会将属于数据库一部分的处理保留在数据库中。应用程序代码不能代替触发器,在更新数据库并未能触发应用程序的触发器之前(例如,第一次使用DBMS的管理控制台时),您不会走得太远

让数据库完成数据库的工作,让应用程序完成应用程序的工作。如果您对数据库有特定的性能问题,可以通过从数据库中移动处理来解决性能问题,在这种情况下,您可能需要考虑这样做。p> 但是,担心数据库性能而不存在数据库性能问题(这是您在这里似乎正在做的事情)是愚蠢的,而且,不幸的是,这显然是对许多Stackoverlow海报的预占用。

最不可伸缩SQL???


查看“联合”。安全性是使用存储过程的另一个优点。如果不使用动态代码(包括存储的进程),则不必在表级别设置安全性。这意味着你的用户不能做任何事情,除非他们有一个proc。这是减少欺诈可能性的一种方法

进一步的过程比大多数应用程序代码更容易进行性能调整,甚至更好,当需要更改时,这就是您在生产中所要做的,而不是重新编译整个应用程序

必须在数据库级别维护数据完整性。这意味着约束、默认值、外键、可能的触发器(如果您有非常复杂的规则或涉及多个表的规则)。如果不在数据库级别执行此操作,最终将出现完整性问题。Peolpe将为问题编写一个快速修复程序,并在查询窗口中运行代码,而所需的规则将丢失,从而导致更大的问题。millino新记录必须通过ETL程序导入,该程序不访问应用程序,因为
UPDATE table SET cnt = cnt + 1
SELECT id,cnt FROM table
...
foreach row
...
UPDATE table SET cnt = row.cnt+1 WHERE id=row.id
...