Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.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 Rails外键逻辑_Ruby On Rails_Database_Activerecord - Fatal编程技术网

Ruby on rails Rails外键逻辑

Ruby on rails Rails外键逻辑,ruby-on-rails,database,activerecord,Ruby On Rails,Database,Activerecord,如果我没有错的话,Rails使用ActiveRecord实现了自己的外键逻辑。这是否有助于提高性能,即不依赖数据库进行额外的处理逻辑或进行频繁的数据库事务?还是因为其他原因?不,那是为了避免重复。干的数据库中的外键关系反映在应用程序中。应该只有一个地方可以描述这种关系。我认为这是关于应用程序的健壮性 DBA可以轻松删除任何外键约束,使您的应用程序陷入混乱 尝试插入将引发SQL异常。如果在一个表上有多个外键约束,那么确定哪一列和值触发了异常是一件痛苦的事情。首先检查并向最终用户提供一条有意义的错误

如果我没有错的话,Rails使用ActiveRecord实现了自己的外键逻辑。这是否有助于提高性能,即不依赖数据库进行额外的处理逻辑或进行频繁的数据库事务?还是因为其他原因?

不,那是为了避免重复。干的数据库中的外键关系反映在应用程序中。应该只有一个地方可以描述这种关系。

我认为这是关于应用程序的健壮性

DBA可以轻松删除任何外键约束,使您的应用程序陷入混乱

尝试插入将引发SQL异常。如果在一个表上有多个外键约束,那么确定哪一列和值触发了异常是一件痛苦的事情。首先检查并向最终用户提供一条有意义的错误消息要容易得多

在大型数据库中,通常会关闭外键约束,以提高性能,并使维护、备份/恢复和复制不易出错。

Rails仍然使用与正常情况相同的外键。只是它没有强制使用外键约束

假设您在模型中设置了验证以阻止数据损坏,则无需在数据库中使用显式外键约束即可通过

定义约束是一种重复形式,但我更喜欢它来维护数据完整性。即使定义了ActiveRecord关联和验证,在迁移或批量更新等过程中仍然很容易弄乱数据结构。有许多插件可以让您轻松地将FK干法定义为正常ActiveRecord迁移的一部分


此外,即使不创建FK约束关系,也可能希望在外键上至少定义一个索引,以便在执行类似于
post.comments
的操作时,不会导致进行完整表扫描以查找具有匹配
post\u id
的所有注释(当您定义FK约束时,许多DBMS会隐式地为您这样做).

我理解Rails中已经有了when Foreign键实现,那么为什么在数据库中有了它,但问题是,与db级别相比,在应用程序级别使用它有什么好处。这是性能问题吗?正如Stephan所说的那样-如果您只需要配置/更改一个位置,您往往可以更快地完成任务r、 如果从应用程序外部使用应用程序数据库,则需要SQL异常,否则rails可以在创建元素时检查db的完整性(至少通过验证)。我认为验证比SQL(ActiveRecord)异常更方便用户和开发人员。