Rails中通常避免使用外键吗?

6
Rails没有在迁移中创建外键的方法(但是有插件可以做到这一点)。还有很多级联选项,所以您可以获得级联删除等功能。
考虑到所有这些内置选项,是否值得在数据库中创建外键?Rails开发人员通常会避免这样做吗?如果这是推荐的实践,你会认为Rails会原生支持它。
3个回答

11

在John Topley的回答上,我进行了一些研究,并找到了DHH对这个主题的一些看法,这使得阅读更有趣:

我没有找到DHH将数据库称为“巨大的哈希表”,因此也许John是引述了另一个引语。我很想阅读DHH意见的更加最新版本。

我没有找到太多其他人在过去几年中写下的意见。以下是我发现的:

  • (2008年1月) 博客文章标题为"在Rails中应该使用外键约束"
  • (2007年11月) 一篇有用的博客文章,其中包含更多关于外键优缺点的研究

  • 6
    这是一个非常重要的问题,因为Rails的创始人DHH曾经说过他认为数据库本质上就是一个巨大的哈希表。因此,对于那些坚持纯粹的Rails方式的开发者来说,利用一些数据库引擎擅长的特性(如约束或存储过程)并不被认为是Rails方式。
    话虽如此,如果您想要在最接近数据的地方强制执行数据完整性,或者您的数据库被其他应用程序共享,那么请使用其中一个插件创建外键。毕竟,这会有什么伤害呢?

    2
    听起来好像 Rails 将成为良好数据库使用的失败之道 :p - ryeguy
    1
    @ryeguy 互联网是好的数据库使用的崩溃。了解一下NoSQL :p - user229044

    4
    Rails不会阻止你在数据库中使用外键约束,只是默认情况下不提供。 "Rails Way" 是依赖于Rails来管理您的数据库,级联删除,强制引用完整性等。
    有几个插件可以将外键约束添加到您的迁移中,但我通常选择手动添加。假设您已创建了CreateUsers和CreatePosts迁移,您可以添加一个“LinkPostsToUsers”迁移:
    # Assumes PostgreSQL
    class LinkPostsToUsers < ActiveRecord::Migration
      def self.up
        execute "
          ALTER TABLE posts 
            ADD CONSTRAINT fk_posts_user_id
            FOREIGN KEY (user_id) REFERENCES users(id)
            ON DELETE CASCADE
            ON UPDATE CASCADE"
      end
    
      def self.down
        execute "ALTER TABLE posts DROP CONSTRAINT fk_posts_user_id"
      end
    end
    

    你错误地拼写了"REFERENCES"这个单词。 - Dmitry

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接