2010-01-09 2 views
0

Каков наиболее приемлемый подход Rails?Подтвердить FK сейчас или восстановить позже?

Validate, что внешний ключ существует на создание/обновление

или

«Контроль повреждения», когда мы хотим использовать внешний ключ несуществующей?

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

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

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

Как опытные разработчики Rails справляются с этой проблемой?

+0

Исправленные данные более ценны для меня - приложения приходят и уходят, и это экономит время кодирования вокруг плохих данных, когда вам нужно его получить. –

+0

+1 при использовании FK, даже с рельсами, имеющими валидации данных в моделях. Вы никогда не знаете, когда другое приложение должно будет иметь доступ к вашей БД, поэтому, по крайней мере, сохранение целостности (а не бизнес-правил) в вашей БД с использованием FK - это умный ход. –

ответ

1

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

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

Я также часто использую FK между таблицами, которые удаляются с помощью логических удалений (a la act_as_paranoid, устанавливают флаг deleted_at, а не фактически удаляют строку), что также облегчает проблемы с отказом FK, и я нахожусь очень полезную стратегию, по крайней мере, в моем приложении.