metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2013-07-30 08:07 pm

Рельсы и констрейнты в БД

http://guides.rubyonrails.org/migrations.html#active-record-and-referential-integrity
"The Active Record way claims that intelligence belongs in your models, not in the database. As such, features such as triggers or foreign key constraints, which push some of that intelligence back into the database, are not heavily used."

В ActiveRecord червь не рекомендует делать констрейнты в БД. Это огорчение, т.к. например, я сломал к хуям (т.е. до невозможности вообще хоть что-либо сделать из UI) хипстерское веб-приложение одним SQL-запросом :)

[identity profile] bydlorus.livejournal.com 2013-07-30 05:35 pm (UTC)(link)
С обработкой ошибок всегда больше проблем чем помощи :-)

[identity profile] sergiej.livejournal.com 2013-07-30 05:38 pm (UTC)(link)
Ну можно конечно не обрабатывать, а тупо показать юзеру или бросить обратно по интерморде. Но не думаю что юзер будет доволен таким оборотом событий

[identity profile] bydl0coder.livejournal.com 2013-07-30 05:41 pm (UTC)(link)
Есть еще уличная магия - обработать и показать нетупо. Не все владеют, конечно.

[identity profile] sergiej.livejournal.com 2013-07-30 05:51 pm (UTC)(link)
Но возни с этим столько, что имхо в большинстве случаев проще побеспокоиться о качестве данных ДО инсертов.
Постоянно сталкиваюсь с ситуацией, когла приложение "ожидало" что на базе будет констрейнт. Потом криворукие снимают консрейнт, потому что бизнес задолбал и "разрешил" дубли, потому что могут, а в приложение залезть не могут. Так что обработка консистентности данных на уровне приложения это ещё и буфер от хитрозадых бизнесов

[identity profile] bydlorus.livejournal.com 2013-07-30 05:41 pm (UTC)(link)
А можно в вызовах библиотеки входные параметры не проверять и ArgumentException не кидать, т.к. "придётся позаботиться завернуть вылетевший эксепшн в логику приложения, а это никак не меньше работы чем позаботиться о данных до попытки передать их тупо."

Т.е. логика немного кривая. Забота о целостности данных должна быть везде. Если мы, конечно, говорим о referential integrity а не о проверке возвраста пользователя в триггерах.

[identity profile] sergiej.livejournal.com 2013-07-30 05:53 pm (UTC)(link)
Если в дополнение к проверке приложением есть ещё и констрейнт то я не против, если конечно на производительность не влияет, при больших таблицах - влияет.