【问题标题】:Rails foreign key logicRails 外键逻辑
【发布时间】:2009-11-12 09:57:09
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails database activerecord


    【解决方案1】:

    Rails 仍然像平常一样使用 外键。只是它没有强制使用外键约束

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

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

    此外,即使您不创建 FK 约束关系,您仍可能希望至少在外键上定义一个索引,因此当您执行 post.comments 之类的操作时,您不会导致全表扫描找到与post_id 匹配的所有 cmets(当您定义 FK 约束时,许多 DBMS 会为您隐式执行此操作)。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我了解 Rails 中已经存在外键实现,那么为什么在数据库中实现,但问题是与数据库级别相比,在应用程序级别拥有它的好处是什么。是表演吗?
      • 正如 Stephan 所说的那样 - 如果您只需要配置/更改一个地方,您往往会更快地完成工作。
      【解决方案3】:

      我认为这与应用程序的健壮性有关。

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

      尝试插入将引发 SQL 异常。如果您在表上有多个外键约束,那么确定哪个列和值触发了异常会很痛苦。首先检查并给最终用户一个有意义的^h^h^h^h^h^henacing^h^h^h^h^h^h^h^h有意义的错误消息要容易得多。

      在大型数据库中,通常的做法是关闭外键约束,以提高性能并减少维护、备份/恢复和复制出错的可能性。

      【讨论】:

      • 如果应用程序数据库在应用程序之外使用,则需要 SQL 异常,否则 rails 可以在您创建元素时检查 db 的完整性(至少通过验证)。我认为验证比 SQL (ActiveRecord) 异常更加用户友好和开发人员友好。
      猜你喜欢
      • 2018-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      相关资源
      最近更新 更多