Существуют ли инструменты для Rails для проверки ссылочной целостности базы данных? - PullRequest
3 голосов
/ 31 августа 2010

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

Несмотря на то, что Rails не обеспечивает ссылочную целостность на уровне базы данных - и по ряду веских причин, обсуждаемых в другом месте, она останется такой - было бы неплохо иметь инструменты, которые могут проверять, находится ли база данных в согласованном состоянии.

Поскольку модели описывают, что «должно быть», не может быть, чтобы автономный инструмент проверял целостность всех данных. Его можно запускать регулярно, перед резервным копированием данных или просто ради хорошего сна разработчиков.

Есть что-нибудь подобное?

Ответы [ 2 ]

2 голосов
/ 06 сентября 2010

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

Чтобы использовать его в миграции, добавьте что-то вроде этого:

execute('ALTER TABLE users ADD FOREIGN KEY (language_id) REFERENCES languages(id)')

, чтобы столбец language_id пользователей ссылался надопустимая строка в таблице языков.

В зависимости от вашей СУБД это даже автоматически создаст для вас индекс.Есть также плагины для rails (см. Pg_on_rails), которые определяют простые в использовании функции псевдонимов для этих задач.

Проверка целостности только в файле резервной копии не имеет смысла, так как ошибка уже произошла, и ваши данныеможет быть уже испорчен.(Я был там) С другой стороны, при использовании ограничений внешнего ключа, как указано выше, каждая операция, которая нарушит целостность, будет неудачной.

Думайте об этом, как об обращении к стоматологу, когда вы чувствуете боль(= хирургическое вмешательство) вместо чистки зубов ОДНАЖДЫ волшебной зубной пастой, которая гарантирует, что ваши зубы будут в порядке до конца жизни.

Еще одна вещь, которую следует учитывать: ошибка в вашем приложении будет многоего легче найти, потому что в коде, который пытается вставить поврежденные данные, возникнет исключение.

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

0 голосов
/ 02 сентября 2010

Как насчет использования СУБД для обеспечения RI? Вам не нужны Rails, чтобы сделать это за вас.

...