Внешних ключей в Rails вообще избегают? - PullRequest
5 голосов
/ 03 марта 2010

Rails не может создавать внешние ключи при миграции (однако, для этого есть плагины). Существует также множество вариантов каскадирования, так что вы можете получать каскадные удаления, например.

Имея все эти встроенные опции, стоит ли создавать внешние ключи в базе данных? Это то, чего обычно избегают разработчики Rails или как? Вы бы подумали, если бы это было рекомендуемой практикой, чтобы Rails изначально его поддерживал.

Ответы [ 3 ]

8 голосов
/ 18 октября 2011

Просто добавив к ответу Джона Топли, я провел небольшое исследование и нашел некоторые мысли DHH по этой теме, которые делают интересное чтение:

Я не смог найти DHH, ссылающуюся на базу данных как "гигантский хэш", поэтому, возможно, Джон перефразирует другую цитату. Я хотел бы прочитать более актуальную версию мнения DHH.

Я не нашел слишком много мнений других людей, написанных за последние пару лет. Вот те, которые я нашел:

5 голосов
/ 03 марта 2010

Это вопрос святости, потому что DHH (создатель Rails) ранее заявлял, что он рассматривает базу данных как гигантскую хеш-таблицу, поэтому пользуясь некоторыми вещами, которые хороши для движков баз данных, используя Такие функции, как ограничения или хранимые процедуры, не считаются путями Rails пуристами Rails.

Тем не менее, если вы хотите обеспечить целостность ваших данных, наиболее близких к данным, или если ваша база данных используется другими приложениями, то непременно используйте один из этих плагинов для создания внешних ключей. В конце концов, какой вред это может сделать, верно?

4 голосов
/ 03 марта 2010

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...