Логика внешнего ключа Rails - PullRequest
2 голосов
/ 12 ноября 2009

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

Ответы [ 3 ]

2 голосов
/ 12 ноября 2009

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

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

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

Кроме того, даже если вы не создадите отношения ограничений FK, вам все равно, вероятно, потребуется определить хотя бы индекс для внешнего ключа, поэтому, когда вы делаете что-то вроде post.comments, вы не вызываете полное сканирование таблицы. чтобы найти все комментарии с совпадающим post_id (когда вы определяете ограничения FK, многие СУБД делают это для вас неявно).

2 голосов
/ 12 ноября 2009

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

1 голос
/ 12 ноября 2009

Я бы подумал, что речь идет об устойчивости приложения.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...