代码之家  ›  专栏  ›  技术社区  ›  ryeguy

钢轨上的外键一般都要避免吗?

  •  5
  • ryeguy  · 技术社区  · 14 年前

    rails无法在迁移中创建外键(不过,也有插件可以做到这一点)。还有很多级联选项,因此您可以获得级联删除,例如。

    内置了所有这些选项,是否值得在数据库中创建外键?这是Rails开发人员通常避免的吗?您可能会想,如果这是一个推荐的实践,那么rails会在本机上支持它。

    3 回复  |  直到 13 年前
        1
  •  5
  •   John Topley    14 年前

    这是一个神圣的问题,因为dhh(rails的创建者)之前已经声明,他认为数据库本质上是一个巨大的哈希表,所以不考虑通过使用诸如约束或存储过程之类的特性来利用数据库引擎擅长的一些东西。由rails纯粹主义者设计的rails。

    也就是说,如果您希望强制数据的完整性与数据最接近,或者如果您的数据库被其他应用程序共享,那么就一定要使用其中一个插件来创建外键。毕竟,它会造成什么伤害,对吧?

        2
  •  8
  •   Adam Spiers    13 年前

    除了约翰·托普利的回答之外,我做了一些研究,发现了DHH关于这个话题的一些想法,这让我读到了一篇有趣的文章:

    我找不到dhh将数据库称为“巨大的散列”,所以也许john正在改写另一个引语。我想读一本更新版的DHH的意见书。

    在过去的几年里,我没有从别人那里得到太多的意见。以下是我找到的:

        3
  •  4
  •   user229044    14 年前

    rails并不阻止您在数据库中使用外键约束,它只是在默认情况下不会将它们提供给您。“rails方式”是依赖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