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] juan-gandhi.livejournal.com 2013-07-30 05:12 pm (UTC)(link)
Да ну их нахуй.

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

[identity profile] bydl0coder.livejournal.com 2013-07-30 05:33 pm (UTC)(link)
Строчка осталась в доке с тех времен, когда из баз они один мускуль знали (можно blame посмотреть ради прикола). В нынешних и DSL для констрейнов в миграциях, само поднимется, откатится. Нефиг маны читать потому что, хуяк хуяк и в продакшен. Это тебя нанимают за 7 штук админку писать?

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

[identity profile] bydlorus.livejournal.com 2013-07-30 05:37 pm (UTC)(link)
> Нефиг маны читать потому что

Т.е. рельсы это таки говно?

[identity profile] bydl0coder.livejournal.com 2013-07-30 05:37 pm (UTC)(link)
Тьфу блин.
are not heavily used
Олег, залогиньтесь.

[identity profile] henu3detb.livejournal.com 2013-07-30 05:37 pm (UTC)(link)
Лучше пусть в продакшне будет необработанный эксепшн, чем неконсистентные данные, которые боком начнут вылазить через пол года на другой машине на другом континенте. Вот тогда будет точно ребус, откуда оно.

[identity profile] metaclass.livejournal.com 2013-07-30 05:37 pm (UTC)(link)
Констрейнты что до базы (в UI), что после базы обрабатываются достаточно однообразно, главное сунуть обработчик в точку через которую запросы ходят.
Зато при их наличии гарантированно, что внешние псы ходящие в базу, приложение не попортят.

[identity profile] bydl0coder.livejournal.com 2013-07-30 05:37 pm (UTC)(link)
Вы так говорите, как будто хуяк и в продакшен это что-то плохое.

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

[identity profile] metaclass.livejournal.com 2013-07-30 05:40 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:41 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:41 pm (UTC)(link)
" что внешние псы ходящие в базу, приложение не попортят."
Расстреливать сразу

[identity profile] bydlorus.livejournal.com 2013-07-30 05:44 pm (UTC)(link)
Вообще-то FK - это метаданные, которые зачастую сами по себе весьма полезны. По ним можно генерить всякую инфу. Например, я как-то писал прогу, которая из базы выдирает только данные, связанные с определённым проектом - от таблицы Projects по FK расходилась выборка нужного (анальные корпоративные правила не позволяли высылать всю базу).

[identity profile] bydlorus.livejournal.com 2013-07-30 05:45 pm (UTC)(link)
Legacy?

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

[identity profile] bydl0coder.livejournal.com 2013-07-30 05:47 pm (UTC)(link)
А чо плохо-то? Что нет DSL для описания любых констрейнов любой ебанутой базы?

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

[identity profile] bydlorus.livejournal.com 2013-07-30 05:49 pm (UTC)(link)
Что на доки забили.

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

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

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

[identity profile] henu3detb.livejournal.com 2013-07-30 06:00 pm (UTC)(link)
Может оно и самое то, но для обычного вдумчивого подхода, для людей которые хотят выпускать стабильные приложения, констрейнты тоже подходят.

Page 1 of 4